• <sup id="mk476"></sup>
    <dl id="mk476"></dl>
  • <progress id="mk476"><tr id="mk476"></tr></progress>
    <div id="mk476"><tr id="mk476"></tr></div>
    <sup id="mk476"><ins id="mk476"></ins></sup>
  • <progress id="mk476"></progress>
    <div id="mk476"></div>
    <div id="mk476"><tr id="mk476"></tr></div>
  • <div id="mk476"></div>
    <dl id="mk476"><s id="mk476"></s></dl><dl id="mk476"></dl><div id="mk476"></div>
  • <div id="mk476"></div>
    <dl id="mk476"><ins id="mk476"></ins></dl>

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

    爬前叨叨

    缘由

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

    python3爬虫入门教程

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

    python3爬虫入门教程
    有很明?#32536;?#20998;页表示

    列表如下

    Request URL: http://cgk.kxjs.tj.gov.cn/navigation.do
    Request Method: POST

    参数说明,里面两个比?#29616;?#35201;的 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 ?#36824;?#28388;重复请求。

    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步,第一步解析列表?#24120;?#33719;取详情页面的链接,第二步获取具体的字段,在匹配字段的时候采用字典动态更新,用来生成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)
    

    科技计划项目成果数据入库

    入库操作非常简单了,走一遍之前的博客就可以,这个网站爬取的过程中没有太多问题,就是总是宕机掉,采?#20040;?#29702;IP也没有解决,应该只是?#26790;?#36895;度慢的原因,建议多爬取一下。

    最后,发现详情?#24120;?#26368;后的id=数字是连续?#32536;模?#21487;以直接迭代

    http://cgk.kxjs.tj.gov.cn/detail.do?id=60

    python3爬虫入门教程

    对付这?#20013;?#25968;据的网站,其实采用Selenium?#21442;?#23581;不可啊~~

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

    posted @ 2019-02-24 09:54 梦想橡皮擦 阅读(...) 评论(...) 编辑 收藏
    江苏11选5软件