美文网首页
scrapy爬虫框架

scrapy爬虫框架

作者: Gary134 | 来源:发表于2019-02-28 17:30 被阅读0次

    特点:爬取效率高、扩展性强、Python编写跨平台运行

    数据流程

    Scrapy中的数据流由执行引擎控制,其过程如下:
    1、引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
    2、引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
    3、引擎向调度器请求下⼀个要爬取的URL。
    4、调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
    5、一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
    6、引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
    7、Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
    8、引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
    9、(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。


    安装scrapy

    mac、linux安装

    pip install scrapy -i https://pypi.douban.com/simple
    

    window安装
    1.scrapy依赖twiste,进入http://www.lfd.uci.edu/~gohlke/pythonlibs/,找到适合的版本,下载对应python版本的Twisted‑18.9.0‑cp36‑cp36m‑win32.whl

    安装版本.png
    2.在下载安装存放的目录下安装
    pip install Twisted‑18.9.0‑cp36‑cp36m‑win32.whl
    

    3.如遇到需要下载pywin32,请下载安装

    # Python for Windows Extensions - Browse /pywin32/Build 221 at SourceForge.net
    pip install pypiwin32
    

    4.安装scrapy

    pip install scrapy
    

    项目创建

    1.创建项目

    scrapy startproject hupugear(项目名称)
    

    2.创建spiders,进入项目名称下创建

    scrapy genspider hupu(蜘蛛名) bbs.hupu.com/gear(访问网站域名)
    

    3.配置文件
    修改settings文件

    # 防止被爬网站的robots.txt起作用
    ROBOTSTXT_OBEY = False   # True改为False
    
    FEED_EXPORT_ENCODING = 'utf-8'   # 添加编码格式
    

    4.蜘蛛执行命令

    scrapy crawl hupu(蜘蛛名)
    

    5.保存到文件 (csv, xml, pickle, marshal)

    scrapy crawl hupu(蜘蛛名) -o result.json(生成文件名及格式)
    

    6.其他
    Spider 属性
    name: Spider名字
    allowed_domains: 允许爬取的域名
    start_urls: Spider启动时爬取的url列表
    parse: 负责解析返回的响应,提取数据或进⼀步处理
    创建Item
    Item是保存爬取数据的容器
    解析Response
    使用Item
    后续Request


    scrapy使用

    Selector 是 Scrapy的选择器,基于lxml构建,支持xpath, css, 正则表达式匹配

    scrapy shell https://bbs.hupu.com/gear
    result = response.selector.xpath("//a[@class='truetit']/text()")
    type(result)
    
    result = response.selector.xpath("//a[@class='truetit']/text()").extract()
    result
    

    SelectorList 和 Selector都可继续调用xpath()和css() 方法

    result = response.selector.xpath("//div[contains(@class, 'author')]")
    type(result)
    
    result.xpath('./a[1]/text()').extract()
    result.xpath('./a[1]/text()').extract_first()
    result.xpath('./a[1]/text()')[0]
    result.xpath('./a[3]/text()').extract()
    result.xpath('./a[3]/text()').extract()[0]
    result.xpath('./a[3]/text()').extract_first()
    

    extract()[0] 与 extract_first()区别

    result = response.css('.author.box').xpath('./a[2]/text()').extract()
    
    result = response.css('.endreply.box a::text').extract()
    result = response.css('.endreply.box a::attr(href)').extract()
    
    result = response.css('.author.box').xpath('./a[2]/text()').re('(.*?)-.*?-')
    

    项目文件

    1.spider

    1、name:爬虫的名字。
    2、allowed_domains:允许爬取的域名,不在此范围的链接不会被跟进爬取。
    3、start_urls:起始URL列表,当我们没有重写start_requests()方法时,就会从这个列表开始爬取。
    4、custom_settings:用来存放蜘蛛专属配置的字典,这里的设置会覆盖全局的设置。
    5、crawler:由from_crawler()方法设置的和蜘蛛对应的Crawler对象,Crawler对象包含了很多项目组件,利用它我们可以获取项目的配置信息,如调用crawler.settings.get()方法。
    6、settings:用来获取爬虫全局设置的变量。
    7、start_requests():此方法用于生成初始请求,它返回一个可迭代对象。该方法默认是使用GET请求访问起始URL,如果起始URL需要使⽤POST请求来访问就必须重写这个方法,发送POST请求使使用FormRequest方法
    8、parse():当Response没有指定回调函数时,该方法就会被调用,它负责处理Response对象并返回结果,从中提取出需要的数据和后续的请求,该方法需要返回类型为Request或Item的可迭代对象(生成器当前也包含在其中,因此根据实际需要可以用return或yield来产生返回值)。
    9、closed():当蜘蛛关闭时,该方法会被调用,通常用来做一些释放资源的善后操作。

    2.Downloader Middleware

    2.1 调度器将Request发给Downloader下载之前,可以对Request进行修改process_request(request, spider)
    2.2 下载后生成的Response发给Spider之前,可以对Response进行修改process_response(request, response, spider)
    2.3 Downloader或process_request()方法异常
    process_exception(request, exception, spider)

    3.Pipeline(管道)

    图片管道:Image pipeline

    get_media_requests(self,item, info):
    ##  ImagePipeline根据image_urls中指定的url进行爬取,可以通过get_media_requests为每个url生成一个Request。
    

    如:

    for image_url in item[‘image_urls’]:
     self.default_headers[‘referer’] = image_url
     yield Request(image_url, headers=self.default_headers)
    
    item_completed(self, results, item, info):
    ## 图片下载完毕后,处理结果会以二元组的方式返回给item_completed()函数。
    

    这个二元组定义如下:

    (success, image_info_or_failure)
    

    其中,第一个元素表示图片是否下载成功;第二个元素是一个字典。如:

     def item_completed(self, results, item, info):
     image_paths = [x[‘path’] for ok, x in results if ok]
     if not image_paths:
     raise DropItem(“Item contains no images”)
     item[‘image_paths’] = image_paths
     return item
    

    相关文章

      网友评论

          本文标题:scrapy爬虫框架

          本文链接:https://www.haomeiwen.com/subject/slqkuqtx.html