zoukankan      html  css  js  c++  java
  • 简单总结scrapy使用方法

    应课程需要写了几天爬虫,一开始使用requests+bs4的技术路线,但是速度不是很理想而且不能暂停,通过查阅资料,发现scrapy正是我需要的

    做一下简短的记录:

    首先应该毫不犹豫的scrapy startproject  gnspider;scrapy genspider gnspider http://www.chinanews.com;

    然后定义items文件,写下我们希望爬虫下载的内容

    紧接着去测试gnspider能否请求到网页

    gnspider的写法

     1 class GnspiderSpider(scrapy.Spider):
     2 
     3   name = “gnspider”
     4 
     5   #从seed页开始,放入start_urls = []
     6 
     7   #seed页很多,则可以在def start_requests(self):重定义scrapy.Request(url),并返回由其组成的请求列表,即retuen [scrapy.Request(url),scrapy.Request(url),.....]
     8 
     9   def parse(self,response):
    10 
    11     #response是我们需要的网页的响应,我们通过css选择器或者xpath进行定位标签元素,这一步是最关键的,快速定位是必须的
    12      response.css("div.content_list ul li div.dd_bt a::attr(href)").extract()  #由于本科时了解过css,这里二话不说就用cssSelector,extract()是为了提取内容,结束提取则extract(),未结束则接着找标签。
    13 
    14     response.css("div.left_zw p::text").extract()
    15 
    16     content_list=response.xpath('//div[@id="artibody"]/p/text()').extract()
    17 
    18     big_urls=sel.xpath('//div[@id="tab01"]/div/h3/a/@href').extract()    #'http://news.sina.com.cn/guide'
    19     big_titles=sel.xpath("//div[@id="tab01"]/div/h3/a/text()").extract()
    20     second_urls =sel.xpath('//div[@id="tab01"]/div/ul/li/a/@href').extract()
    21     second_titles=sel.xpath('//div[@id="tab01"]/div/ul/li/a/text()').extract()
    22 
    23  
    24 
    25     divs = response.xpath("//div[@id='J_ItemList']/div[@class='product']/div")
    26 
    27     div.xpath("p[@class='productPrice']/em/@title")[0].extract()
    28 
    29     div.xpath("p[@class='productTitle']/a/@title")[0].extract()
    30 
    31     div.xpath("p[@class='productTitle']/a/@href")[0].extract()
    32 
    33     
    34 
    35     item["SHOP_NAME"] = div.xpath("li[1]/div/a/text()")[0].extract()
    36     item["SHOP_URL"] = div.xpath("li[1]/div/a/@href")[0].extract()
    37     item["COMPANY_NAME"] = div.xpath("li[3]/div/text()")[0].extract().strip()
    38     item["COMPANY_ADDRESS"] = div.xpath("li[4]/div/text()")[0].extract().strip(
    39 
    40     #对于每个链接进行请求,这里我想强调的是meta这个参数,可以帮助我们将一级页面上爬到的内容传递到二级页面上,通过response.meta这个字典进行传递,非常方便我们对item进行组装
    41 
    42     for li in lis:
    43 
    44       yield scrapy.Request(li,callback = self.parse_detail,meta={"cate":cate})
    45 
    46  
    47 
    48  
    49 
    50   def parse_detail(self,response):    #解析二级页面
    51 
    52     #经常我们爬取的是一个列表
    53 
    54     str1 = “”.join(lis)     #split方法中不带参数时,表示分割所有换行符、制表符、空格。
    55 
    56     str1 = replace(" ","").replace("u3000","")
    57 
    58     return item

    写gnspider的时候一定不要一口气写完,一定要一个函数一个函数的测,首先保证地址写对了,其次保证标签选对了,最后保证item组装好了,我把它称为爬虫三段式

    既然爬到了内容就应该存下来留个纪念,通过pipelines定义存储方式,在这里使用文件存储

    class MyspiderPipeline(object):
      # def open_spider(self,spider):#针对爬虫
      # self.f = open('gn.txt','a')
    
      # def close_spider(self,spider):
      # self.f.close()
    
      def process_item(self, item, spider):#针对item
        self.f = open(cate[item["CATEGORY"]] + '.txt','a')    #注意文件操作,防止乱码
        line = str(dict(item)["CONTENT"]) + '
    '
        self.f.write(line)
        self.f.close()
        return item

    最后别忘了在配置文件中启用pipelines

    总结如下:

    简单爬虫三步走,1.定义items,2.parse页面,3.pipelines定义存储方式

    其中parse页面又分为三步1.写对网址,2.找到标签,3.组装item

    scrapy还提供了暂停功能:开始爬虫时使用命令  scrapy crawl gnspider  -s JOBDIR=supplement/auto

    暂停时使用ctrl + c

    再次启动时还使用命令  scrapy crawl gnspider -s JOBDIR=supplement/auto

    当爬取大量数据时推荐写多个爬虫,同时进行,可使电脑资源发挥最大效果

    爬完结束提示信息如下

  • 相关阅读:
    谈谈适配器模式
    最近面试的感想
    如何解决超链接访问后hover样式就不渲染
    单页面和多页面的网页差别比较(SPA)
    mongoDB发生服务特定错误: 100.
    win系统没有此电脑怎么办?
    u盘空间变小,少了好多空间
    VS Code 解决 因为在此系统上禁止运行脚本
    远离麻木的感觉
    瀑布布局(waterflall flow)实现
  • 原文地址:https://www.cnblogs.com/anqiang1995/p/7782289.html
Copyright © 2011-2022 走看看