Python爬蟲入門教程 39-100 天津市科技計劃項目成果庫數據抓取 scrapy
阿新 • • 發佈:2019-02-24
格式 () extract lba 重寫 動態 meta 操作 pos
爬前叨叨
緣由
今天本來沒有打算抓取這個網站的,無意中看到某個微信群有人問了一嘴這個網站,想看一下有什麽特別復雜的地方,一頓操作下來,發現這個網站除了卡慢,經常自己宕機以外,好像還真沒有什麽特殊的....
爬取網址 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也未嘗不可啊~~
歡迎關註,我的微信號哦~~~
Python爬蟲入門教程 39-100 天津市科技計劃項目成果庫數據抓取 scrapy