scrapy是什么?
scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。爬取更快,程序更加健壮。
目录
一、安装scrapy
conda install scrapy
二、scrapy的基本使用
1.创建scrapy项目
终端输入 scrapy startproject 项目名称
eg:scrapy startproject scrapy_090
注意:不能包含中文,不能以数字命名,最好也不要以‘_’+数字的形式,程序会自动创建一个以项目名为前缀的class,数字开头会报错,但是我用‘_’+数字的形式命名,自动创建的类还是以数字开头,直接抹去了‘_’,这一点也规避一下吧。
2.创建爬虫文件
进入到spiders文件夹下,创建爬虫文件
创建爬虫文件:
scrapy genspider 爬虫文件的名字 要爬取的网页地址
eg:scrapy genspider baidu www.baidu.com
注意:这里的网页地址不需要加 'http://',因为自动创建的文件中会自动添加该协议。如下图所示。
3.运行爬虫代码
scrapy crawl 爬虫的名字
这里爬虫的名字就是你创建的爬虫文件名,也就是上图中的‘name’的值
但是运行上面代码后,并没有打印 print 中的内容。
输出的内容中有下面这样一句,这是一个反爬,robots协议。
我们去到这个文件下看一看
这里面显示了很多不可以爬取的地址
怎么解决呢?
打开spiders文件夹的同级文件 settings.py ,将 ‘ROBOTSTXT_OBEY = True’ 注释掉即可。
’
然后重新运行爬虫文件,就可以成功打印了
三、项目结构和基本方法——五八同城
打开五八同城官网,并输入一个职位点击同城搜索,右键检测,找到页面的接口。
1.创建爬虫项目
scrapy startproject scrapy_091
2.创建爬虫文件
scrapy genspider tongcheng58 https://sz.58.com/sou/?key=%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91&classpolicy=uuid_
f566wFb2nsxz2wYPNP4mapnNbJcsCwQC%2Cclassify_B&search_uuid=f566wFb2nsxz2wYPNP4mapnNbJcsCwQC&search_type=input
但是可能会报不是内部或外部命令的错误,不用担心,文件已经创建好了。
然后我们打开创建好的文件
发现start_urls不全,不知道为啥呢?直接补全吧。
补全后是这样
然后注释掉 setting.py文件中的 ‘ROBOTSTXT_OBEY = True’
3.运行爬虫文件
scrapy crawl tongcheng58
然后就输出了我们 print 中的内容
4.项目结构
项目名称
- 项目名称
- spiders (存储的是爬虫文件)
-__init__.py
- 自定义的爬虫文件 (最重要的核心功能文件)
- __init__.py
- items.py (定义数据结构的地方,即爬取的数据都包含哪些)
- middlewares.py (中间件, 即写代理机制的地方)
- pipelines.py (管道 , 即 用来处理下载的数据)
- setting.py (配置文件, robots协议、UA等在这里定义)
- scrapy.cfg
5.response的属性和方法
content = response.text 获取的是相应的字符串
content = response.body 返回的是二进制数据
content = response.xpath('Xpath语法') 可以直接使用Xpath解析response中的内容
response.xpath('Xpath语法').extract() 获取selector对象的data属性值
or
content.extract()
content.extract_first() 提取selector列表的第一个数据
or
content.get()
完整代码:tongcheng58.py
import scrapy
class Tongcheng58Spider(scrapy.Spider):
name = 'tongcheng58'
allowed_domains = ['sz.58.com']
start_urls = ['https://sz.58.com/quanzhizhaopin/?key=%E5%89%8D%E7%AB%AF&classpolicy=strategy%2Cuuid_846182c8bc514b0580c27bfd5390c824%2Cdisplocalid_4%2Cfrom_674%2Cto_jump%2Ctradeline_job%2Cclassify_B&search_uuid=846182c8bc514b0580c27bfd5390c824&final=1']
def parse(self, response):
# 字符串
# content = response.text
# 二进制数据
# content = response.body
# 解析数据
content = response.xpath('//*[@type="button"]/@value')
# content = content.extract()
content = content.extract_first()
print('===================================')
print(content)
print('===================================')
四、scrapy工作原理——汽车之家
获取汽车之家的某个品牌车的名字、图片及报价
找到网页接口
然后
1.创建爬虫项目 scrapy startproject scrapy_093
2.创建爬虫文件 scrapy genspider carhome http://...
获取品牌车的名字、图片及报价
import scrapy
class CarhomeSpider(scrapy.Spider):
name = 'carhome'
allowed_domains = ['car.autohome.com.cn']
start_urls = ['https://car.autohome.com.cn/price/brand-33-628.html']
def parse(self, response):
print('=======================')
# content = response.text
name = response.xpath('//div[@class="main-title"]/a/text()')
price = response.xpath('//span[@class="lever-price red"]/span/text()')
print(name.extract())
print(price.extract())
print('=======================')
1.scrapy架构组成
(1)引擎(Engine):引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。
(2)调度器(Scheduler):调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
(3)下载器(Downloader):下载器负责获取页面数据并提供给引擎,而后提供给spider。
(4)Spiders:Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。 更多内容请看 Spiders 。
(5)Item Pipeline:Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。 更多内容查看 Item Pipeline 。
Item Pipeline的经典应用:
①清理HTML数据
②验证爬取的数据(检查item包含某些字段)
③查重(并丢弃)
④将爬取结果保存到数据库中
(6)下载器中间件(Downloader middlewares):下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response(也包括引擎传递给下载器的Request)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。处理下载请求部分。
(7)Spider中间件(Spider middlewares):Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 Spider中间件(Middleware) 。处理解析部分。
2.scrapy工作原理
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给调度器。(可下载则给Iitem,不可下载则给Scheduler继续解析,即第9步)
9.(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。