Python爬虫—scrapy

介绍

  • scrapy中文文档是一个为了爬取网站数据、提取结构性数据而编写的应用框架,我们只需实现少量的代码,即可快速抓取数据。

  • scrapy使用了Twisted异步网络框架,可以加快下载速度。
    在这里插入图片描述

创建项目

  • 流程:
    • 创建项目:scrapy startproject (爬虫名字)
    • 创建爬虫:进入项目所在路径,执行命令scrapy genspider (爬虫名字) ('网站的域名')
      • 注意: 爬虫名字和项目名字不能相同
    • 执行爬虫:进入项目所在路径,scrapy crawl (爬虫名字)
      • 注意: 爬虫名字无需加后缀
  • 目录结构
    • items.py:用来存放爬虫爬取下来数据的模型。
    • middlewares.py:存放各种中间文件。
    • pipelines.py:将items的模型存放到本地磁盘中。
    • settings.py:爬虫的设置(请求头,多久发送一次请求,ip代理池等)。
    • scrapy.cfg:项目的配置文件。
    • spiders文件夹:所有的爬虫,都放在这个里面。

各文件详解

爬虫文件

  • 使用logging设置日志。
  • response是一个scrapy.http.response.html.HtmlResponse对象。可执行xpathcss selector来提取数据。
  • response对象提取数据的常用方法:
    • extract():获取文本。返回列表。
    • extract_first():只获取到第一个文本。返回字符串。
    • get():获取的是Selector中的第一个文本,返回字符串。
    • getall():获取Selector中的所有文本,返回列表。
  • 提取到的数据,是Selector或者SelectorList对象。
  • 如果数据解析回来,要传给pipline处理,可以使用yield来返回给pipelines
  • item:建议在items.py中定义好模型,以后就不要使用字典。
  • 翻页爬取:
    • xpath判断是否有下一页
      • 有:yield scrapy.Request(next_url,callback=self.parse)
      • 无:直接return停止parse()
    • 注意: callback参数指向的函数,如果请求方式相同,就是原函数parse()。否则可以自定义parse1()...
  • 获取settings的配置参数:self.settings.attributes.keys()

settings.py

  • 任何一个爬虫项目的第一步就是设置 ROBOTSTXT_OBEY = False,默认True
  • 添加请求头:给DEFAULT_REQUEST_HEADERS字典添加键值对,可以添加ua,cookies
  • 限制日志的输出:添加LOG_LEVEL='WARNING',这样只会打印warning及以上的日志
  • 日志保存到本地:添加LOG_FILE='./xxx.log',会保存在爬虫项目同一目录下而不打印出来
  • 常用参数的含义:
    • BOT_NAME:项目名称。
    • SPIDER_MODULESNEWSPIDER_MODULE:爬虫的位置。
    • CONCURRENT_REQUESTS:最大线程数量,默认为16。
    • DOWNLOAD_DELAY:下载延迟。就是请求后sleep()多少秒。
    • CONCURRENT_REQUESTS_PER_DOMAIN,CONCURRENT_REQUESTS_PER_IP
      每个域名和ip的最大请求数,必须配合DOWNLOAD_DELAY使用。
    • COOKIES_ENABLED:下一次请求是否携带上一次的cookies,默认开启。
    • DEFAULT_REQUEST_HEADERS:默认请求头,user-agent,cookie等都在这里添加
  • settings.py自己添加的参数怎么在爬虫文件中使用:
    • parse()self.settings['参数']self.settings.get('参数','')
    • from [项目名].settings import [参数]
  • settings.py自己添加的参数怎么在pipelines.py中使用:
    • process_item()):parse() -> spider.settings.get('参数')

pipelines

  • 激活:在settings.py中,设置ITEM_PIPLINES,即取消注释。
  • 多个爬虫:可以给ITEM_PIPELINES传入多个Project0Pipeline, 根据条件爬取多个网站
  • 有3个常用方法:
    • open_spider(self,spider):爬虫开始时执行,
      一般写self.fp=open(path,mode)可在此对爬虫文件添加属性:
      (open函数)spider.index = 3 -> (爬虫文件)print(self.index)
    • process_item(self,item,spider):爬虫传进来数据item的时候执行
      一般写self.fp.write()
      如果不return,另一个权重较低的pipelines就不会获取到该item
    • close_spider(self,spider):爬虫关闭的时候执行
      一般会写self.fp.close()
  • 权重:settings.pyITEM_PIPLINES的数字代表权重。数字约【小】优先级越【高】。
  • 为什么可能有多个pipeline
    • 可能会有多个spider,不同的pipeline处理不同的item内容
    • 一个spider的内容可能要做不同的操作,比如存入不同的数据库中
  • 获取settings的配置参数:
    open_spider -> spider.settings.get('参数名',None)
    

middlewares

  • 开启:settings.py -> DOWNLOADER_MIDDLEWARES打开
  • Downloader Middlewares默认的方法:
    • process_request(self,request,spider):
      当每个request通过下载中间件时调用
    • process_response(self,request,response,spider):
      当下载器完成http请求,传递响应给引擎时调用

logging模块

  • scrapy框架中

    1. settings.py设置LOG_LEVEL='WARNING'
    2. settings.py设置LOG_FILE='./xxx.log',这样既可设置日志保存的位置,设置后终端不会显示日志内容。
    3. import logging
      
      #实例化logger对象,可在任何py文件中输出想要的日志
      logger=logging.getlogger(__name__)
      
  • 普通.py文件中

    import logging
    
    #设置日志样式
    logging.basicConfig(...)		
    
    #实例化logger对象,可在任何文件中导入调用logger
    logger = logging.getlogger(__name__)	
    

CrawlSpider

寻找url地址更方便。

  • 创建爬虫:scrapy genspider -t crawl [爬虫名] [域名]
  • 指定start_urls,对应的响应会通过规则提取url地址。
  • 完善urls:添加Rule(LinkExtractor(allow='正则',callback='',follow=''))
    • 参数:
      • allow: 包含url规则的LinkExtractor对象
      • callback: 制定满足规则的url的解析函数字符串
      • follow: response中提取的链接是否继续跟进
  • 若url不完整,crawlspider会自动补充完整后请求。
  • parse()函数名不能改变,也不能再定义,因为它有特殊的功能需要实现(如基础url提取)
  • spiders.Rule常见参数:
    • link_extractor:是一个LinkExtractor对象,用于定义需要提取的链接。
    • callback:连接读取器提起出来的url对应的响应交给它处理。
    • follow:连接读取器提起出来的url对应的响应是否继续被rules来过滤。
    • process_links:用来过滤url。指定该spider中那个的函数会被调用,
      link_extractor中获取到链接列表时自动调用。
    • process_request:用来过滤request
      指定该spider中哪个的函数将会调用,该规则提取到每个request时都会调用该函数
  • linkExtractor更多常见参数:
    • allow:满足re的匹配,如果括号为空,匹配所有。
    • deny:对allow取反,对re全不匹配。(优先级高于allow)
    • allow_domains:会被提取的url的域名。
    • deny_domains:对allow_domains取反。
    • restrict_xpaths:使用xpath和allow共同作用过滤。即xpath满足条件的url会被提取。

scrapy shell

  • 简述:Scrapy Shell是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以来测试Xpath
  • 使用方法:scrapy shell [网址url]
  • 常用属性:
    • response.url:当前响应的url地址。
    • response.request.url:当前响应对象请求的url。
    • response.headers:响应头。
    • response.body:响应体,即html代码,默认为byte类型。
    • response.requests.headers:当前响应的请求头。

scrapy_redis

  • Scrapy_redis在scrapy的基础上实现了更多、更强大的功能。具体体现在:request去重、爬虫持久化、轻松实现分布式。[参考](
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值