爬虫框架Scrapy笔记

安装

安装 Python

  • https://www.python.org/downloads/windows/下载对应版本的文件

  • 点击下载的文件安装

  • 安装完成后,找到安装后的文件。设置环境变量。给PATH添加C:\Users\xxx\AppData\Local\Programs\Python\Python38-32C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\Scripts

  • cmd中输入pythonpip正常显示

安装 Scrapy

直接使用pip install scrapy安装失败。

这里先手动安装几个依赖库

整体架构和组成

Scrapy的架构图

  • Spiders:爬虫,定义了爬取的逻辑和网页内容的解析规则,主要负责解析响应并生成结果和新的请求
  • Engine:引擎,处理整个系统的数据流处理,出发事物,框架的核心。
  • Scheduler:调度器,接受引擎发过来的请求,并将其加入队列中,在引擎再次请求时将请求提供给引擎
  • Downloader:下载器,下载网页内容,并将下载内容返回给spider
  • ItemPipeline:项目管道,负责处理spider从网页中抽取的数据,主要是负责清洗,验证和向数据库中存储数据
  • Downloader Middlewares:下载中间件,是处于ScrapyRequestRequesponse之间的处理模块
  • Spider Middlewaresspider中间件,位于引擎和spider之间的框架,主要处理spider输入的响应和输出的结果及新的请求middlewares.py里实现

scrapy框架的整体执行流程

  • spideryeildrequest发送给engine
  • enginerequest不做任何处理发送给scheduler
  • scheduler,生成request交给engine
  • engine拿到request,通过middleware发送给downloader
  • downloader在获取到response之后,又经过middleware发送给engine
  • engine获取到response之后,返回给spiderspiderparse()方法对获取到的response进行处理,解析出items或者requests
  • 将解析出来的items或者requests发送给engine
  • engine获取到items或者requests,将items发送给ItemPipeline,将requests发送给scheduler
  • **备注:**只有调度器中不存在request时,程序才停止,及时请求失败scrapy也会重新进行请求)

常用命令

  • scrapy startproject projectname:创建一个项目名为projectname的项目
  • scrapy genspider filename xxx.com:创建一个Spider爬虫文件
  • scrapy genspider -t crawl filename xxx.com::创建一个CrawlSpider爬虫文件
  • scrapy crawl spidername:运行名为spidername的爬虫
  • scrapy crawl spidername -o res.json:运行命名为spidername的爬虫,并将结果输出到res.json文件(可以是csvxmljson格式的文件)
  • scrapy crawl spidername -o res.json -s FEED_EXPORT_ENCODING=UTF8:运行命名为spidername的爬虫,并将结果输出到res.json文件,编码格式为UTF8
  • scrapy list:列出所有爬虫
  • scrapy settings [options]:获取配置信息
  • scrapy shell urlpath:命令行模式爬取一个页面,方便调试。可以直接用来测试XPathCSS表达式

创建项目

  • 执行 scrapy startproject demo,创建一个名为demo的项目

项目目录文件介绍

  • scrapy.cfg:项目配置文件
  • demo/:该项目的python模块。在此放入代码
  • demo/spiders/:存放 Spider 文件,也就是爬虫文件
  • demo/items.py:相当于一个容器,和字典很像
  • demo/middlewares.py:中间件
  • demo/pipelines.py:定义Item Pipeline的实现,实现数据的清洗,储存,验证
  • demo/settings.py:全局配置

Spider

基本结构如下:

# -*- coding: utf-8 -*- import scrapy class DemoSpider(scrapy.Spider): name = 'demoSpider' allowed_domains = ['xxx.com'] start_urls = ['http://xxx.com/list/7'] def parse(self, response): pass
  • name:爬虫的名称,唯一的
  • allowed_domains:允许爬取的域名,比如一些网站有相关链接,域名就和本网站不同,这些就会忽略
  • start_urls:是Spider爬取的网页,定义初始的请求url,可以多个
  • __init__(self):初始化方法,在这里可以自定义一些类的属性,实例化一些只需要实例化一次对象等
  • closed(self, spider):关闭前执行的方法,用于销毁一些对象等
  • start_requests(self):可用来覆盖start_urls,自定义爬虫爬取
  • parse(self, response):是Spider的一个方法,在请求start_urls后,之后的方法,这个方法是对网页的解析,与提取自己想要的东西。response参数是请求网页后返回的内容,也就是你需要解析的网页

CrawlSpider

基本结构如下:

# -*- coding: utf-8 -*- import scrapy, re from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class CrawlspiderSpider(CrawlSpider): name = 'crawlSpider' allowed_domains = ['xxx.com'] start_urls = ['http://xxx.com/list/7'] rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): item = {} #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item

rules属性由几个Rule对象构成,而Rule对象定义了提取链接等操作的规则

Rule对象的六个属性:

  • LinkExtractor(…):用于提取response中的链接
  • callback='str':回调函数,对提取的链接使用,用于提取数据填充item
  • cb_kwargs:传递给回调函数的参数字典
  • follow=True/False:对提取的链接是否需要跟进
  • process_links:一个过滤链接的函数
  • process_request:一个过滤链接Request的函数

LinkExtractor参数:

  • allow='re_str':正则表达式字符串,提取response中符合re表达式的链接。
  • deny='re_str':排除正则表达式匹配的链接
  • restrict_xpaths='xpath_str':提取满足xpath表达式的链接
  • restrict_css='css_str':提取满足css表达式的链接
  • allow_domains='domain_str':允许的域名
  • deny_domains='domain_str':排除的域名
  • tags='tag'/['tag1','tag2',…]:提取指定标签下的链接,默认会从aarea标签下提取链接
  • attrs=['href','src',…]:提取满足属性的链接
  • unique=True/False:链接是否去重
  • process_value:值处理函数,优先级要大于allow

Selector选择器

Scrapy框架中已内置了Selector选择器

xpath()

通过书写xpath表达式,可使程序返回该表达式所对应的所有节点的selector list选择器列表,从而筛选我们想要定位的元素。

常用规则

  • /:表示选取直接子节点
  • //:表示选取所有子孙节点
  • .:选取当前节点
  • ..:选取当前结点的父节点
  • @:选取属性
# ... def parse(self, response): # response.xpath('//title/text()') # response.xpath('//title/text()').extract() # response.xpath('//title/text()').extract_first() # response.xpath('//base/@href').extract() # response.xpath('//a[contains(@href, "image")]/@href').extract() # response.xpath('//a[contains(@href, "image")]/img/@src').extract() links = response.xpath('//a[contains(@href, "image")]') for index, link in enumerate(links): args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) print 'Link number %d points to url %s and image %s' % args

css()

根据css表达式,返回该表达式所对应的所有节点的selector list选择器列表

# ... from scrapy import Selector # ... def parse(self, response): sel = Selector(html) text = sel.css('.cla::text').extract_first() # .cla 表示选中类名为 cla 的节点 # ::text 表示获取文本 # extract_first() 表示返回第一个元素,也可以写成sel.css('.cla::text')[0]来获取第一个元素(容易报错,不过没有就会报超出最大索引的错误) # extract() 表示选取所有,是一个列表 # sel.css('.cla::sttr('class')').extract_first() 表示获取class # sel.css('div[class="cla"]::text') 表示获取指定属性的文本 # response 为请求网页的返回值,可以直接写成:response.css()来解析,提取我们想要的信息 # response.css('title::text') # response.css('base::attr(href)').extract() # response.css('a[href*=image]::attr(href)').extract() # response.css('a[href*=image] img::attr(src)').extract()

re()

根据书写的正则表达式,对数据进行提取,返回Unicode字符串list列表

不能构造嵌套式的 .re() 调用

def parse(self, response): # response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)') # response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')

extract()

序列化节点为Unicode字符串,并返回list列表

Settings

常用配置介绍

  • ROBOTSTXT_OBEY:是否遵循网站的robots.txt配置
  • DOWNLOAD_DELAY:爬虫爬取的间隔延迟,单位s。爬取间隔太短很容易被封
  • COOKIES_ENABLED:是否允许cookies。如果注释掉默认没有开启cookie、为False时默认使用setting里面的cookie、为True时会把setting里面的cookie关掉,使用自定义cookie
  • FEED_EXPORT_ENCODING='UTF8':编码格式,可以设置为UTF8
  • DEFAULT_REQUEST_HEADERS:配置默认的请求头
  • DOWNLOADER_MIDDLEWARES:配置中间件。键值越小表示优先调用的意思
  • ITEM_PIPELINES:配置管道。键值越小表示优先级越高
  • settings.py文件中可以配置自定义配置
# ... MY_COOKIES = 'csrftoken=NfqL5bzS9nIAtSqIzN3pkIJw8LcPgzf5; aa_language=cn; django_language=zh-cn; _gcl_au=1.1.1683754222.158253875'
  • 需要引入py文件
# ... from scrapy.utils.project import get_project_settings settings = get_project_settings() cookieStr = settings['MY_COOKIES']

Items

item是保存爬取数据的容器,使用的方法和字典差不多

比如我们要提取的信息有titlethumbcontentviewslikesauthor

  • 修改demo/demo/items.py文件
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://docs.scrapy.org/en/latest/topics/items.html import scrapy class DemoItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # pass title = scrapy.Field() thumb = scrapy.Field() content = scrapy.Field() views = scrapy.Field() likes = scrapy.Field() author = scrapy.Field()
  • 在爬虫文件中使用
# ... from demo.items import DemoItem # ... def parse(self, response): dl = response.css('.board-wrapper dd') item = DemoItem() for dd in dl: item['title'] = dd.css('.board-name::text').extract_first() # ... yield item

笔记列表

项目实例


创作不易,若本文对你有帮助,欢迎打赏支持作者!

 分享给好友: