爬前叨叨
缘由
今天本来没有打算抓取这个网站的, 无意中看到某个微信群有人问了一嘴这个网站, 想看一下有什么特别复杂的地方, 一顿操作下来, 发现这个网站除了卡慢, 经常自己宕机以外, 好像还真没有什么特殊的....
爬取网址 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 也未尝不可啊~~
来源: https://www.cnblogs.com/happymeng/p/10425397.html