1.Scrapy VS requests
requests 一个爬取库,只要作用爬取数据,模拟浏览器,默认是一个线程在运行;(军人)
scrapy 一个框架,集成:
数据的采集:重试机制/设置超时/代理/随机浏览器头,
数据的解析:css选择器,xpath, 正则,(前三个默认支持)BeautifulSoup,Selenium;
数据的存储:专门的类处理,并且可以对每条数据进行处理,支持存储:文件,数据库;
默认是开启16个线程;(军队)
学习成本:requests学习简单;scrapy学习成本稍微高一些(类Django)
爬取速度:requests要想速度快,可以开启多线程;scrapy默认开启16个线程,底层用的异步框架Twisted(类似Tornado);
2.Scrapy简介
使用纯python写的一个爬虫库,底层采集数据的框架使用的是Twisted,默认开启16个线程,所以爬取效率非常高;
scrapy的执行的流程图:
写一个爬取的url,然后封装成一个request的对象,写Spiders(多个)-->交给Spider Middlewares --> 接着由 Scrapy Engine ---> Scheduler(调度器,会有很多封装好的request对象在调度器队列里),引擎(Scrapy Engine)---> DownloaderMiddlewares(下载中间件--配置代理/请求头) ---> Downloader(下载器-->去互联网获取数据,封装成response对象) ---> DownloaderMiddlewares(如果请求正常接着走,否则可以重试) ---> 引擎(Scrapy Engine)---> Spider Middlewares ---> Spider(爬虫,很多) 接受到的数据不建议保存在spider里,而是封装到Items里,好处是可以单条数据处理--->ItemPipline ;
3.Scrapy安装
win下的环境安装:
进入相应的虚拟环境
安装scrapy前,需要装一个依赖,不然会报错:
pip install pywin32
scrapy框架的安装:pip install scrapy -i https://pypi.douban.com/simple/
安装遇到的问题:
当前环境win10,python_3.6.1,64位。
在windows下,在dos中运行pip install Scrapy报错:
building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
解决办法:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件(如我的Twisted‑17.5.0‑cp36‑cp36m‑win_amd64.whl),cp后面是python版本,amd64代表64位,运行命令:
pip install C:UsersvendeDownloadsTwisted-20.3.0-cp38-cp38-win_amd64.whl
其中install后面为下载的whl文件的完整路径名
安装完成后,再次运行:
pip install scrapy -i https://pypi.douban.com/simple
即可安装成功;
4.检验Scrapy是否安装上;
进入虚拟环境然后输入scrapy可以出现其版本等相关信息即可;
5.Scrapy使用案例及学习步骤
1.爬取尚硅谷老师信息:老师名字-name, 职位:position,头像:image,简介:info, 特点:point,风格:style, 保存json文件中;
2.使用xpath解析:
3.关于scrapy项目的创建执行相关命令:标红是动态变化的
创建scrapy爬虫项目命令:scrapy startproject MySpiderProject
cd MySpiderProject
创建爬虫(聚焦类型)命令:scrapy genspider atguigu_teacher www.atguigu.com
运行爬虫命令:scrapy crawl atguigu_teacher
爬虫项目的结构基本介绍,有哪些文件,分别是做什么的
4.测试爬虫是否可以请求到数据,打印数据;
5.使用xpath解析数据,封装到Item,使用yield 把数据返回到管道文件(ItemPipline)
6.在管道文件中对每条数据进行处理,保存,要在设置里配置;
当爬虫开始执行的时候,会执行open_spider方法;(开始)
当传入数据的时候,每次都会执行process_item(根据数据的多少来执行)(中间)
当爬虫结束的时候,会执行close_spider方法;(结束)
6.使用scrapy实现基本爬虫
1.入门案例硅谷老师信息
聚焦爬虫:url:http://www.atguigu.com/teacher.shtml
硅谷老师信息的xpath
公共部分://div[@class="con"]/ul/li
name://div[@class="con"]/ul/li/div[@class="t-info"]/h5/b[1]/text()
position://div[@class="con"]/ul/li/div[@class="t-info"]/h5/b[2]/text()
image://div[@class="con"]/ul/li/div[@class="t-img"]/img/@src
info://div[@class="con"]/ul/li/div[@class="t-info"]/div[@class="memo"]/div[2]/text()
或者 : //div[@class="con"]/ul/li//div[@class="memo-i"]/text()
point://div[@class="con"]/ul/li/div[@class="t-info"]/p[1]/a
style://div[@class="con"]/ul/li/div[@class="t-info"]/p[2]/text()
进入虚拟环境:且进入到创建项目的目录pyproject
scrapy startproject MySpiderProject
(可以看到这个是个项目,可以用ide打开,然后可以看到里面有个和项目名称一样的文件夹,
里面有spiders文件夹,这个文件夹里就是放置我们的爬虫,可以有多个)
cd MySpiderProject
scrapy genspider atguigu_teacher(爬虫名字) www.atguigu.com(允许爬取的范围) // 可以创建四个爬虫(basic-基本/规则)
这时候在spiders文件夹中就会有 atguigu_teacher.py 爬虫文件
一般情况下会单独写一个.py文件 来执行爬虫
这个文件名:start/main 位置一般在项目根目录下;
main.py文件内代码:
from scrapy import cmdline
cmdline.execute("scrapy crawl atguigu_teacher".split())
以后运行项目,直接运行main.py即可
项目文件结构介绍:
MySpiderProject
--MySpiderProject
--spiders 存放多个爬虫的目录
--items.py 里面有一个类(类名无所谓一般随项目定义),
肯定继承scrapy.Item(就是流程图里的Items),里面用于封装数据,传到管道文件;
--middlewares.py 下载中间件配置文件(设置代理/浏览器头即在这里);
--pipelines.py 专门用于处理数据,包括:添加/删除字段,存储数据;
--settings.py 配置文件,配置浏览器头,配置middlewares.py,pipelines.py, 是否遵循爬虫协议(默认是遵循的-True,我们要改为False);
--scrapy.cfg 配置文件(配置和项目名称,一般不用管)