crawler爬虫进阶|Scrapy框架
简介
谈起爬虫必然要提起 Scrapy 框架,因为它能够帮助提升爬虫的效率,从而更好地实现爬虫。
Scrapy 是一个为了抓取网页数据、提取结构性数据而编写的应用框架,该框架是封装的,包含:
request (异步调度和处理)、下载器(多线程的 Downloader)、解析器(selector)和 twisted(异步处理)等。
对于网站的内容爬取,其速度非常快捷。
安装
一般推荐使用Anaconda一键安装
1 conda install -c conda-forge scrapy这里给出常规
pip安装的方法
【强烈推荐】使用**虚拟环境(venv)**进行开发,关于虚拟环境的相关内容见文章:
1 | pip install Scrapy |
如果遇见Twisted依赖包安装错误,这是因为包和python版本不匹配导致的。
可以进入镜像网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 选择符合自己型号和版本的whl文件进行下载
然后cd至下载目录,通过pip install <文件名.whl>的方法安装
之后继续pip install Scrapy即可。
初始化
Scrapy提供了可操作性的 "项目 模式"对爬虫进行操作,避免了"一串代码从头写到尾"的各种弊端,符合模块化思想。
创建项目
1 | scrapy startproject <项目名称> |
cd进入项目所在路径后,执行命令以 创建爬虫:
1 | scrapy genspider <爬虫名称> <爬虫的主要url> |
架构解释
items.py: 用来存放爬虫爬取下来数据的模型middlewares.py: 用来存放各种中间件的文件pipelines.py: 用来将items的模型存储settings.py: 设置爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池等)scrapy.cfg: 项目的配置文件spiders包: 以后所有的爬虫,都是存放到这个里面
基础配置
进入settings.py,为了更好进行爬虫,我们需要进行如下设置
1 | # 遵循 robots.txt 守则 |
由于Scrapy框架运行爬虫程序的方式是通过命令行窗口输入命令:
1 | scrapy crawl <爬虫名称> |
此处,我们直接通过python语法将其写入python文件之中,以便方便运行。
在<项目名称>/<项目名称>/下(与spiders文件夹同目录)新建文件run.py:
1 | from scrapy import cmdline |
具体使用
发起POST请求
有时候我们想要在请求数据的时候发送post请求,那么这时候需要使用Request 的子类
FormRequest来实现。如果想要在爬虫一开始的时候就发送POST请求,那么就在爬虫类中重写
start. requests(self)方法,并且不再调用start. urls里的url
下面以 模拟登录人人影视为例,展示重写方法和发起POST请求的过程。
1 | scrapy startproject rr_login |
进入settings.py设置好后
1 | # spiders/rr.py |
新建运行文件run.py
1 | # run.py |
之后运行即可!
CrawlSpider爬虫
简介
Crawlspider是Spider的一个子类;
Spider类的设计原则是只爬取
start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。后者更适用于分页爬取和整站爬取项目
创建爬虫
前提:已经通过命令
scrapy startproject创建好了项目
cd至工程文件目录下,使用以下命令代替之前的创建爬虫的命令:
1 | scrapy genspider -t crawl <爬虫名称> <域名> |
之后进入路径../<项目名称>/<项目爬虫>/spiders/下的爬虫文件爬虫名称.py
1 | # -*- coding: utf-8 -*- |
与Spider爬虫的区别
- 建立爬虫方式不同
- spider有
parse函数,每次爬虫运行时会自动运行,而crawlspider没有,可自行通过callback回调函数
Rule规则类
链接提取器LinkExtractors
Scrapy Shell
我们一般在爬虫中使用
xpath、beautifulsoup、 正则表达式、css选择器等来提取想要的数据。但是因为
scrapy是个比较"重"的框架。每次运行起来都要等待一段时间。因此要去验证我们写的提取规则是否正确,是一个比较麻烦的事情。所以Scrapy 提供了一个shell,用来方便测试规则。当然也不仅仅局限于这一个功能。
项目文件下,CMD内直接通过命令加想测试的url地址即可:
1 | scrapy shell <url> |
之后可通过python语法,按照自己的想法选取数据即可返回结果,用于测试规则是很方便的。如:
1 | title = response.xpath('//div[@class="dashabi"]//a/text()') |
除此之外,该shell也可以查看到我们settings中的各种设置等等
下载文件/图片
在爬虫基础篇中,我们已经给出了图片下载的方法。
其实,Scrapy集成有更加便捷和快速的方法以下载图片和文件。
- 优点:
- 避免重新下载最近已经下载过的数据。
- 可以方便的指定文件存储的路径。
- 可以将下载的图片转换成通用的格式。比如
png或jpg。 - 可以方便的生成缩略图。
- 可以方便的检测图片的宽和高,确保他们满足最小限制。
- 异步下载,效率非常高。
下载前提
在
items.py中,定义好的两个属性:file_urls(给出列表)和files如果是图片,则分别是
image_urls和images文件下载完成后,系统会自动把文件下载的相关信息存储到
item的files/images属性中。比如下载路径、下载的ur和文件/图片的校验码等。
在配置文件
settings.py中配置FILES_STORE/IMAGE_STORE,这个配置是用来设置文件/图片下载路径。启动
pipeline:在ITEML PIPELINES中设置scrapy.pipelines.files.FilesPipeline:1。图片则是
scrapy.piplines.images.ImagespIPLINE:1。
上手操作
以图片下载为例:
1 | # settings.py |
1 | # piplines.py |
中间件
简介
随机请求头
随机代理
代理池
连接数据库
所需库
pymysql安装方法:
pip install pymysql更多相关知识,详见数据库专题文章
由于连接数据库一般是将数据保存的操作,所以我们将数据库的连接部分放在
piplines.py文件中
1 | # 导包 |
当然,可以根据自己的需求优化代码,如结合python中的try-except设置savepoint,rollback等
但是,当数据量过于庞大时,这种一个个数据进行存储的方式消耗内存,而且性能较差。
这时我们还可以借助异步库twisted(下载安装scrapy库时已集成)实现异步写入数据!
关于异步
设置锁
异步写入数据库
1 | # piplines.py |



