Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy

梦想橡皮擦 2019-02-24 09:54:00 阅读数:174 评论数:0 点赞数:0 收藏数:0

爬前叨叨

缘由

今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的....

python3爬虫入门教程

爬取网址 http://cgk.kxjs.tj.gov.cn/navigation.do

python3爬虫入门教程
有很明显的分页表示

列表如下

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

python3爬虫入门教程

对付这种小数据的网站,其实采用Selenium也未尝不可啊~~

欢迎关注,我的微信号哦~~~

版权声明
本文为[梦想橡皮擦]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/happymeng/p/10425397.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领