目录
Scrapy的介绍
Scarpy开发第一个爬虫
Scrapy项目的启动介绍
Scrapy启动-命令启动
Scrapy启动-脚本启动
Scrapy 数据的提取
Scrapy 保存数据到文件
Item Pipeline的使用
Scrapy 使用ImagePipeline 保存图片
Scrapy 自定义ImagePipeline
Scrapy 中settings配置 的使用
Scrapy 中 Request 的使用
Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架,可 用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。 尽管 Scrapy 最初是为网络抓取而设计的,但它也可用于使用 API提取数据或用作通用网络爬虫。
Scrapy的优势
Scrapy的架构
最简单的单个网页爬取流程是 spiders > scheduler > downloader > spiders > item pipeline 省略了engine环节!
安装
pip install scrapy
创建第一个项目
scrapy startproject myfrist(project_name)
文件说明
创建第一个爬虫
scrapy genspider 爬虫名 爬虫的地址
注意:一般创建爬虫文件时,以网站域名命名
爬虫包含的内容
import scrapy
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = 'douban.com'
start_urls = ['https://movie.douban.com/top250/']
def parse(self, response):
movie_name = response.xpath("//div[@class='item']//a/span[1]/text()").extract()
movie_core = response.xpath("//div[@class='star']/span[2]/text()").extract()
yield {
'movie_name':movie_name,
'movie_core':movie_core
}
注意 运行程序之前,要确认网站是否允许爬取 robots.txt 文件
scrapy命令 scrapy框架提供了对项目的命令scrapy ,具体启动项目命令格式如 下:
方法1:
scrapy crawl 爬虫名
注意 这的爬虫名是爬虫文件中name属性的值
方法2:
scrapy runspider spider_file.py
注意 这是爬虫文件的名字 要指定到spider文件夹
Scrapy为开发者设置好了启动好的对象。因此,我们通过脚本即可 启动Scrapy项目
运行脚本
在项目的目录下,创建脚本,比如项目名为:scrapy01,创建脚本 的路径为 scrapy01\scrapy01\脚本.py
脚本
使用cmdline
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', '爬虫名字'])
使用CrawlerProcess
from scrapy.crawler import CrawlerProcess
from spiders.baidu import BaiduSpider
process = CrawlerProcess()
process.crawl(BaiduSpider)
process.start()
运行
命令行运行
python 脚本.py
Scrapy有自己的数据提取机制。它们被称为选择器。我们可以通过 使用的选择器re、xpath、css提取数据。
提示 不用再安装与引入Xpath,BS4
获得选择器
Response对象获取
正常使用
response.selector.xpath('//span/text()').get()
response.selector.css('span::text').get()
response.selector.re('')
快捷使用
response.xpath('//span/text').get()
response.css('span::text').get()
创建对象
from scrapy.selector import Selector
通过text参数 初始化
body = 'good'
Selector(text=body).xpath('//span/text()').get()
通过response参数 初始化
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
response = HtmlResponse(url='http://example.com',body=body)
Selector(response=response).xpath('//span/text()').get()
'good'
选择器的方法
1.用Python原生方式保存
with open("movie.txt", 'wb') as f:
for n, c in zip(movie_name,movie_core):
str = n+":"+c+"\n"
f.write(str.encode())
2.使用Scrapy内置方式
scrapy 内置主要有四种:JSON,JSON lines,CSV,XML 最常用的导出结果格为JSON,命令如下:
scrapy crawl dmoz -o douban.json -t json
参数设置:
注意
将数据解析完,返回数据,才可以用命令保存,代码如下,格 式为dict或item类型
- return data
- yield data
当数据在Spider中被收集之后,可以传递到Item Pipeline中统一进 行处理
特点
每个item pipeline就是一个普通的python类,包含的方法名如下:
功能
案例代码
class SaveFilePipeline:
def open_spider(self,spider):
self.file = open('douban5.txt','w')
def process_item(self, item, spider):
self.file.write(f'name:{item.get("name")} score:{item.get("score")}\n')
def close_spider(self,spider):
self.file.close()
from scrapy.exceptions import DropItem
class XSPipeline:
def open_spider(self,spider):
self.file = open('xs.txt','w',encoding='utf-8')
def process_item(self, item, spider):
if item.get('title'):
self.file.write(item.get('title'))
self.file.write('\n')
return item
else:
raise DropItem(f"Missing title in {item}")
def close_spider(self,spider):
self.file.close()
Scrapy提供了一个 ImagePipeline,用来下载图片这条管道,图片管 道 ImagesPipeline 提供了方便并具有额外特性的功能,比如:
使用图片管道
scrapy.pipelines.images.ImagesPipeline
使用 ImagesPipeline ,典型的工作流程如下所示:
注意 需要安装pillow4.0.0以上版本 pip install pillow==9.2.0
问题
使用官方默认图片管道,有如下几个问题:
- 文件名不友好
- 存储图片URL的参数名称与类型太固定
解决方案 自定义ImagePipeline,扩展
Scrapy允许自定义设置所有Scrapy组件的行为,包括核心、扩展、 管道和spider本身。
官网-参考配置
设置 — Scrapy 2.5.0 文档 (osgeo.cn)https://www.osgeo.cn/scrap y/topics/settings.html
配置文档
BOT_NAME 默认: 'scrapybot' Scrapy项目实现的bot的名字。用来构造默认 User-Agent,同时 也用来log。 当你使用 startproject 命令创建项目时其也被自动赋值。
CONCURRENT_ITEMS 默认: 100 Item Processor(即 Item Pipeline) 同时处理(每个response 的)item的最大值
CONCURRENT_REQUESTS 默认: 16 Scrapy downloader 并发请求(concurrent requests)的最大 值。
CONCURRENT_REQUESTS_PER_DOMAIN 默认: 8 对单个网站进行并发请求的最大值。 CONCURRENT_REQUESTS_PER_IP 默认: 0 对单个IP进行并发请求的最大值。如果非0,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN 设定, 使用该设 定。 也就是说,并发限制将针对IP,而不是网站。 该设定也影响 DOWNLOAD_DELAY: 如果 CONCURRENT_REQUESTS_PER_IP 非0,下载延迟应用在IP而 不是网站上。 FEED_EXPORT_ENCODING ='utf-8' 设置导出时文件的编码
爬虫中请求与响应是最常见的操作,Request对象在爬虫程序中生 成并传递到下载器中,后者执行请求并返回一个Response对象
Request对象
class scrapy.http.Request(url[, callback,method='GET', headers, body, cookies, meta,encoding='utf-8', priority=0,dont_filter=False, errback])
一个Request对象表示一个HTTP请求,它通常是在爬虫生成,并由 下载执行,从而生成Response 参数
将附加数据传递给回调函数
请求的回调是当下载该请求的响应时将被调用的函数。将使用下载 的Response对象作为其第一个参数来调用回调函数
def parse_page1(self, response):
item = MyItem()
item['main_url'] = response.url
request = scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
request.meta['item'] = item
return request
def parse_page2(self, response):
item = response.meta['item']
item['other_url'] = response.url
return item