爬前叨叨
緣由
今天本來沒有打算抓取這個網站的,無意中看到某個微信群有人問了一嘴這個網站,想看一下有什么特別復雜的地方,一頓操作下來,發現這個網站除了卡慢,經常自己宕機以外,好像還真沒有什么特殊的....
爬取網址 http://cgk.kxjs.tj.gov.cn/navigation.do
有很明顯的分頁表示
列表如下
Request URL: http://cgk.kxjs.tj.gov.cn/navigation.do
Request Method: POST
參數說明,里面兩個比較重要的 pageNum
頁碼,numPerPage
每頁顯示的數據
trades:
fields:
enterprise_type:
archive_year:
hsql:
searchKey:
pageNum: 2
numPerPage: 25
date_low:
date_high:
拼接地址
由於是POST請求,所以需要引入FormRequest
類。重寫start_requests
方法,注意
yield FormRequest(url=self.start_url,callback=self.parse,formdata=data,dont_filter=True)
中dont_filter=True
不過濾重復請求。
import scrapy
from scrapy import Request,FormRequest,Selector
import time
class TjSpider(scrapy.Spider):
name = 'Tj'
allowed_domains = ['cgk.kxjs.tj.gov.cn']
start_url = "http://cgk.kxjs.tj.gov.cn/navigation.do"
def start_requests(self):
#yield scrapy.Request(url="http://cgk.kxjs.tj.gov.cn/detail.do?id=1", callback=self.parse_detail)
for i in range(1,73): #73
data = {
"trades":"",
"fields":"",
"enterprise_type":"",
"archive_year":"",
"hsql":"",
"searchKey":"",
"pageNum": str(i),
"numPerPage": "25",
"date_low":"",
"date_high":"",
}
print("正在爬取{i}".format(i=i))
yield FormRequest(url=self.start_url,callback=self.parse,formdata=data,dont_filter=True)
time.sleep(10)
數據解析
這個步驟分為2步,第一步解析列表頁,獲取詳情頁面的鏈接,第二步獲取具體的字段,在匹配字段的時候采用字典動態更新,用來生成mongodb的字典格式。
def parse(self, response):
links = response.css('#Result tr td:nth-child(1)>a::attr(href)').extract()
date = response.css('#Result tr td:nth-child(2)::text').extract()
for item in range(len(links)):
# yield {
# "link":links[item],
# "date":date[item]
# }
yield scrapy.Request(url=response.urljoin(links[0]),callback=self.parse_detail,meta={"date":date[item]})
def parse_detail(self,response):
trs = Selector(response).xpath("//table[@class='tab_lx003'][2]/tbody/tr")
item = {}
item.update({"date":response.meta["date"]})
for tr_item in trs:
item.update({tr_item.xpath("td[1]/text()").extract_first():tr_item.xpath("td[2]/text()").extract_first()})
yield item
time.sleep(3)
科技計划項目成果數據入庫
入庫操作非常簡單了,走一遍之前的博客就可以,這個網站爬取的過程中沒有太多問題,就是總是宕機掉,采用代理IP也沒有解決,應該只是訪問速度慢的原因,建議多爬取一下。
最后,發現詳情頁,最后的id=數字
是連續性的,可以直接迭代
http://cgk.kxjs.tj.gov.cn/detail.do?id=60
對付這種小數據的網站,其實采用Selenium也未嘗不可啊~~
歡迎關注,我的微信號哦~~~