c爬虫抓取网页数据(Python开发的一个快速、高层次引擎(Scrapy)())
优采云 发布时间: 2022-04-03 23:09c爬虫抓取网页数据(Python开发的一个快速、高层次引擎(Scrapy)())
一、概览
Scrapy,一个用 Python 开发的快速、高级的屏幕抓取和网页抓取框架,用于抓取网站并从页面中提取结构化数据。
Scrapy 用途广泛,可用于数据挖掘、监控和自动化测试。它最初是为页面抓取(更准确地说,网络抓取)而设计的,后端也用于获取 API(例如 Amazon Associates Web Services)或通用网络爬虫返回的数据。 Scrapy 的吸引力在于它是一个任何人都可以根据自己的需要轻松修改的框架。
还提供了各类爬虫的基类,如BaseSpider、sitemap爬虫等。最新版本提供了对web2.0爬虫的支持。
二、Scrapy 五个基本组件:
Scrapy 框架组件
调度器
下载器
爬虫
物理管道
Scrapy 引擎
(1),调度器:
调度器,说白了就是假设它是一个优先级的URL队列(被爬取的网站或链接),它决定了下一个要爬取的URL是什么,并移除重复的URL(不是无用的工作)。用户可以根据自己的需要自定义调度器。
(2),下载器:
下载器是所有组件中最繁重的组件,用于在网络上高速下载资源。 Scrapy 的下载器代码并不太复杂,但是效率很高。主要原因是Scrapy下载器是建立在twisted的高效异步模型之上的(其实整个框架都是建立在这个模型之上的)。
(3)、蜘蛛:
爬虫是用户最关心的部分。用户自定义自己的爬虫(通过自定义正则表达式等语法),从特定网页中提取自己需要的信息,即所谓的实体(Item)。用户还可以从中提取链接,让 Scrapy 继续抓取下一页。
(4),项目管道:
实体管道用于处理蜘蛛提取的实体。主要功能是持久化实体,验证实体的有效性,清除不必要的信息。
(5),Scrapy 引擎:
Scrapy 引擎是整个框架的核心。它用于控制调试器、下载器和爬虫。其实引擎相当于计算机的CPU,控制着整个过程。
三、整体架构
四、Scrapy 安装和项目生成
1Scrapy 安装
Microsoft Windows [版本 10.0.19043.1586]
(c) 微软公司。保留所有权利。
C:\WINDOWS\system32>python -m pip install --upgrade pip
C:\WINDOWS\system32>pip 安装轮子
C:\WINDOWS\system32>pip install lxml
C:\WINDOWS\system32>pip install twisted
C:\WINDOWS\system32>pip install pywin32
C:\WINDOWS\system32>pip install scrapy
2 构建项目
scrapy startproject 项目名称
scrapy genspider爬虫名称域名
scrapy crawler 名称
Microsoft Windows [版本 10.0.19043.1586]
(c) 微软公司。保留所有权利。
C:\WINDOWS\system32>scrapy startproject TXmovies
新建 Scrapy 项目 'TXmovies',使用模板目录 'C:\Users\1234\anaconda3\lib\site-packages\scrapy\templates\project',创建于:
C:\WINDOWS\system32\TXmovies
您可以通过以下方式启动您的第一个蜘蛛:
cd TXmovies
scrapy genspider 示例
C:\WINDOWS\system32>cd TXmovies
C:\Windows\System32\TXmovies>scrapy genspider txms
在模块中使用模板“basic”创建了蜘蛛“txms”:
TXmovies.spiders.txms
C:\Windows\System32\TXmovies>
3 创建后目录的大体页面如下
ProjectName #项目文件夹
ProjectName #项目目录
items.py #定义数据结构
middlewares.py #middleware
pipelines.py #数据处理
settings.py #全局配置
蜘蛛
__init__.py #crawler 文件
百度.py
scrapy.cfg #项目基础配置文件
五、案例
1.创建一个项目
打开终端输入(建议放在合适的路径,默认是C盘)
Microsoft Windows [版本 10.0.19043.1586]
(c) 微软公司。保留所有权利。
C:\WINDOWS\system32>scrapy startproject TXmovies
新建 Scrapy 项目 'TXmovies',使用模板目录 'C:\Users\1234\anaconda3\lib\site-packages\scrapy\templates\project',创建于:
C:\WINDOWS\system32\TXmovies
您可以通过以下方式启动您的第一个蜘蛛:
cd TXmovies
scrapy genspider 示例
C:\WINDOWS\system32>cd TXmovies
C:\Windows\System32\TXmovies>scrapy genspider txms
在模块中使用模板“basic”创建了蜘蛛“txms”:
TXmovies.spiders.txms
C:\Windows\System32\TXmovies>
2.修改设置
修改三项,第一是不遵循机器人协议,第二是下载间隙。由于下面的程序需要下载多个页面,所以需要给一个gap(不给也可以,但是很容易被检测到),第三个是请求头,添加一个User-Agent,四是打开管道
ROBOTSTXT_OBEY = 假
DOWNLOAD_DELAY = 1
DEFAULT_REQUEST_HEADERS = {
'接受':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome /27.0.1453.94 Safari/537.36'
}
ITEM_PIPELINES = {
'TXmovies.pipelines.TxmoviesPipeline':300,
}
3.确认要提取的数据,item item
item 定义要提取的内容(定义数据结构)。比如我提取的内容是电影名和电影描述,所以我创建了两个变量。 Field方法的实际做法是创建一个字典,给字典添加一个新的值,暂时不赋值,等数据提取出来再赋值。下面的item结构可以表示为:{'name':'','description':''}。
# -*- 编码:utf-8 -*-
# 在这里为你的抓取物品定义模型
#
# 参见文档:
#
导入scrapy
类 TxmoviesItem(scrapy.Item):
# 在此处为您的项目定义字段,例如:
# name = scrapy.Field()
name = scrapy.Field()
description = scrapy.Field()
4.写一个爬虫
我们要写的部分是parse方法的内容,重点是xpath怎么写,xpath我就不多说了,有兴趣可以看我的其他文章 , XPATH 教程
介绍一下刚才写的item,刚才说item中创建的变量是字典的key值,可以直接赋值。赋值后交给管道处理。
简单说一下这段代码的思路,首先腾讯视频的url是
我们注意到偏移项,第一页的偏移量为0,第二页为30,列依次推送。
程序中这个项是用来控制第一页的抓取,但是也必须给一个范围,不能无限,否则会报错。你可以去看看腾讯总共有多少视频页,也可以写一个异常捕获机制,当请求错误被捕获时退出。我这里只是演示,所以只给了120,也就是4页。
产量
程序中有两个收益。我更喜欢称之为中断。当然,中断只发生在 CPU 中。它的功能是转移控制权。在这个程序中,我们封装好item数据后,调用yield将Control交给管道,管道处理完返回,再返回程序。这是对第一次收益的解释。
第二个产量有点复杂。本程序使用回调机制,即回调。回调的对象是 parse,也就是当前方法。通过不断的回调,程序会陷入循环。条件,就会陷入死循环。如果我把这个程序中的 if 去掉,那将是一个无限循环。
yield scrapy.Request(url=url,callback=self.parse)
xpath
另外需要注意的是如何在xpathl中提取数据。有四种写法。第一种写法是获取selector选择器,也就是原创数据,里面收录一些我们不用的东西。第二个 extract() 将选择器序列号转换为字符串。第三个和第四个一样,获取字符串中的第一个数据,就是我们要的数据。
items['name']=i.xpath('./a/@title')[0]
items['name']=i.xpath('./a/@title').extract()
items['name']=i.xpath('./a/@title').extract_first()
items['name']=i.xpath('./a/@title').get()
# -*- 编码:utf-8 -*-
导入scrapy
从 ..items 导入 TxmoviesItem
类 TxmsSpider(scrapy.Spider):
名称 = 'txms'
allowed_domains = ['']
start_urls = ['#39;]
偏移量=0
def 解析(自我,响应):
items=TxmoviesItem()
lists=response.xpath('//div[@class="list_item"]')
对于列表中的 i:
items['name']=i.xpath('./a/@title').get()
items['description']=i.xpath('./div/div/@title').get()
收益项目
如果 self.offset < 120:
self.offset += 30
url = '{}&pagesize=30'.format(str(self.offset))
yield scrapy.Request(url=url,callback=self.parse)
5.交给管道输出
管道可以处理提取的数据,例如将其存储在数据库中。我们只在这里输出。
# -*- 编码:utf-8 -*-
# 在此处定义您的项目管道
#
# 不要忘记将管道添加到 ITEM_PIPELINES 设置中
#参见:
类TxmoviesPipeline(对象):
def process_item(self, item, spider):
打印(项目)
退货
6.运行,执行项目
从 scrapy 导入命令行
cmdline.execute('scrapy crawl txms'.split())
7.测试结果
管道输出结果为白色,调试信息为红色