爬前叨叨
緣由
今天本來沒有打算抓取這個網站的,無意中看到某個微信群有人問了一嘴這個網站,想看一下有什麼特别複雜的地方,一頓操作下來,發現這個網站除了卡慢,經常自己當機以外,好像還真沒有什麼特殊的....

爬取網址 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也未嘗不可啊~~