一、什么是全站爬取
全站爬取(Crawl the Entire Site)是指通过网络爬虫程序遍历并获取一个网站上的所有页面或资源的过程。这种爬取方式旨在获取网站的全部内容,包括文本、图片、视频、链接等,以建立网站的完整内容索引或进行数据分析。
二、全栈爬取介绍
1、全站数据爬取的方式
(1)通过递归的方式进行深度和广度爬取全站数据
可参考相关博文(全站图片爬取),手动借助scrapy、Request模块发起请求。
(2)采用CrawlSpider类r实现自动爬取
对于一定规则网站的全站数据爬取,可以使用CrawlSpider实现自动爬取。
2、CrawlSpider类介绍
CrawlSpider是基于Spider的一个子类。和蜘蛛一样,都是scrapy里面的一个爬虫类,但 CrawlSpider是蜘蛛的子类,子类要比父类功能多,它有自己的都有功能------ 提取链接的功能LinkExtractor(链接提取器)。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。
(1)特点
-
基于规则的爬取:
CrawlSpider
基于规则来定义爬取逻辑,可以根据指定的规则自动发现和爬取页面。 -
提供方便的机制:
CrawlSpider
提供了一系列便捷的机制,如规则定义、链接提取、回调函数等,简化了爬虫程序的编写。
(2)使用方法
-
创建一个
CrawlSpider
子类:首先需要创建一个继承自CrawlSpider
的子类,定义爬取规则和回调函数。 -
定义爬取规则:通过
Rule
对象定义爬取规则,包括提取链接的规则、回调函数等。 -
编写回调函数:定义回调函数,用于处理从页面中提取的数据,如解析页面内容、提取数据等操作。
(3)示例代码
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MyCrawlSpider(CrawlSpider):
name = 'my_crawl_spider'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
Rule(LinkExtractor(allow=r'/page/'), callback='parse_page', follow=True),
)
def parse_page(self, response):
# 解析页面内容,提取数据
# 处理提取的数据,如保存到文件或数据库
pass
在上面的示例中,MyCrawlSpider
是一个自定义的CrawlSpider
子类,定义了爬取规则和回调函数。Rule
对象指定了提取链接的规则,使用了LinkExtractor
来定义规则,允许匹配包含/page/
的链接,并且指定了回调函数为parse_page
。follow=True
表示会跟进提取到的链接。
(4)主要参数介绍
在Scrapy框架中,Rule
对象用于定义爬取规则,指定了链接提取的规则和相应的回调函数。Rule
对象通常用于CrawlSpider
中,帮助爬虫程序自动发现和爬取页面。下面是关于Rule
对象的一些重要信息:
-
link_extractor:指定用于提取链接的
LinkExtractor
对象,可以定义不同的规则来提取链接。 -
callback:指定当链接匹配规则时调用的回调函数,用于处理提取到的页面内容。
-
follow:指定是否跟进从当前页面提取的链接,默认为True,表示跟进链接;设为False则不跟进。
-
process_links:指定一个函数,用于处理从页面中提取的链接,可以对链接进行进一步处理。
-
process_request:指定一个函数,用于处理从页面中提取的请求,可以对请求进行进一步处理。
(5)注意事项
-
了解Scrapy框架:使用
CrawlSpider
前需要熟悉Scrapy框架的基本概念和用法。 -
合理定义规则:定义合适的爬取规则是保证爬虫正常运行的关键,需要根据目标网站的结构和需求进行规则设计。
CrawlSpider
在Scrapy框架中是一个强大的工具,可以帮助开发者快速构建复杂的爬虫程序,实现更灵活和高效的网站数据爬取。
三、完整示例
1、创建一个工程
scrapy startproject Scrapy02
2、创建爬虫文件
# 切换到爬虫工程中
cd Scrapy02
# 创建爬虫文件
scrapy genspider -t crawl spiders www.xxx.com
spiders为爬虫名,域名开始不知道可以先写www.xxx.com代替
创建完成后只需要修改start_urls 以及LinkExtractor中内容并将follow改为True,如果不改的话
只能提取到1、2、3、4、5、6、7、8、67的网页,允许后自动获取省略号中未显示的页面url
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class PhotoSpider(CrawlSpider):
name = "photo"
allowed_domains = ["pic.netbian.com"]
start_urls = ["https://pic.netbian.com/4kmeinv/"]
rules = (Rule(LinkExtractor(allow=r"Items/"), callback="parse_item", follow=True),)
建模
import scrapy
class Scrapy02Item(scrapy.Item):
img_title = scrapy.Field()
img_url = scrapy.Field()
3、页面内容提取
由于该网站没有反爬措施因此无需设置其他内容,这里提取了页面的url以及标题
def parse_item(self, response):
item = Scrapy02Item()
lis = response.xpath('//*[@id="main"]/div[3]/ul/li')
for li in lis:
url = li.xpath('./a/img/@src').extract_first()
title = li.xpath('./a/b/text()').extract_first()
item['img_title'] = title
# 添加域名使url完整
item['img_url'] = 'https://pic.netbian.com/' + url
yield item
return item
4、图片下载
开启管道,这里自定义下载图片继承自带的ImagesPipeline类
import hashlib
from scrapy import Request
from itemadapter import ItemAdapter
from scrapy.pipelines.images import ImagesPipeline
from scrapy.utils.python import to_bytes
from .settings import IMAGES_STORE
class Scrapy02Pipeline:
def process_item(self, item, spider):
return item
class DownloadsimgPipline(ImagesPipeline):
def get_media_requests(self, item, info):
url = item['img_url']
yield Request(url=url, meta={'item': item})
def file_path(self, request, response=None, info=None, *, item=None):
item = request.meta['item']
# image_guid = hashlib.sha1(to_bytes(request.url)).hexdigest() # 获取加密标题
image_guid = item.get('img_title') # 获取原来标题
return u'{0}/{1}.jpg'.format(IMAGES_STORE, image_guid)
自定义下载只需要重写get_media_requests和file_path,这两个方法(如有其他需求可以重写其他方法,仅仅下载图片到本地指定内容修改这两个方法足以)
IMAGES_STORE这里在settings中添加的下载的路径名不能自定义名,否则无法下载。
5、额外设置
# USER_AGENT设置
from fake_useragent import UserAgent
USER_AGENT = UserAgent().random
# 不遵守ROBOTS.txt
ROBOTSTXT_OBEY = False
# 日志级别设置
LOG_LEVEL = 'ERROR'
# ITEM_PIPELINES 持久化配置
ITEM_PIPELINES = {
"Scrapy02.pipelines.Scrapy02Pipeline": 300,
"Scrapy02.pipelines.DownloadsimgPipline": 301,
}
# 添加下载储存目录
IMAGES_STORE = r'D:\python\Photo\4K'
6、需要注意的问题
(1)PhotoSpider类下的name = "photo"需要与spiders下面的py文件名保持一致,不然会找不到该py文件
(2)持久化配置不要忘记添加下载的类
ITEM_PIPELINES = {
"Scrapy02.pipelines.Scrapy02Pipeline": 300,
"Scrapy02.pipelines.DownloadsimgPipline": 301,
}
标签:全站,提取,url,CrawlSpider,爬取,item,scrapy
From: https://www.cnblogs.com/xiao01/p/18117503