首页 > 其他分享 >scrapy框架之CrawlSpider全站爬取

scrapy框架之CrawlSpider全站爬取

时间:2024-04-06 16:01:30浏览次数:28  
标签:全站 提取 url CrawlSpider 爬取 item scrapy

一、什么是全站爬取

全站爬取(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)特点

  1. 基于规则的爬取CrawlSpider基于规则来定义爬取逻辑,可以根据指定的规则自动发现和爬取页面。

  2. 提供方便的机制CrawlSpider提供了一系列便捷的机制,如规则定义、链接提取、回调函数等,简化了爬虫程序的编写。

(2)使用方法

  1. 创建一个CrawlSpider子类:首先需要创建一个继承自CrawlSpider的子类,定义爬取规则和回调函数。

  2. 定义爬取规则:通过Rule对象定义爬取规则,包括提取链接的规则、回调函数等。

  3. 编写回调函数:定义回调函数,用于处理从页面中提取的数据,如解析页面内容、提取数据等操作。

(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_pagefollow=True表示会跟进提取到的链接。

(4)主要参数介绍

在Scrapy框架中,Rule对象用于定义爬取规则,指定了链接提取的规则和相应的回调函数。Rule对象通常用于CrawlSpider中,帮助爬虫程序自动发现和爬取页面。下面是关于Rule对象的一些重要信息:

  1. link_extractor:指定用于提取链接的LinkExtractor对象,可以定义不同的规则来提取链接。

  2. callback:指定当链接匹配规则时调用的回调函数,用于处理提取到的页面内容。

  3. follow:指定是否跟进从当前页面提取的链接,默认为True,表示跟进链接;设为False则不跟进。

  4. process_links:指定一个函数,用于处理从页面中提取的链接,可以对链接进行进一步处理。

  5. process_request:指定一个函数,用于处理从页面中提取的请求,可以对请求进行进一步处理。

(5)注意事项

  1. 了解Scrapy框架:使用CrawlSpider前需要熟悉Scrapy框架的基本概念和用法。

  2. 合理定义规则:定义合适的爬取规则是保证爬虫正常运行的关键,需要根据目标网站的结构和需求进行规则设计。

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,如果不改的话

image

只能提取到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

相关文章

  • 如何爬取bcz的词汇
    如何爬取BCZ的四级/六级词汇声明:以下内容仅供学习参考,切勿滥用,滥用与本作者无关!一,安装Charles抓包工具步骤:打开Charles查看主机地址配置手机端代理(主机地址:端口)安装证书信任抓取测试抓取数据包解析数据包查看csv数据关于下载安装Charles,安装证书,配置......
  • 【爬虫】项目篇-selenium爬取大鱼潮汐网
    爬取指定日期的潮汐数据创建driver对象,并设为最大窗口url="https://www.chaoxibiao.net/tides/75.html"option=Options()option.binary_location=r"C:\Users\txmmy\AppData\Local\Google\Chrome\Application\chrome.exe"drvier=webdriver.Chrome(options=option......
  • 【爬虫】项目篇-使用selenium、requests爬取天猫商品评论
    目录使用selenium使用requests使用seleniumfromselenium.webdriverimportChrome,ChromeOptionsfromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasE......
  • 【爬虫】项目篇-爬取豆瓣电影周榜Top10,保存至Redis
    写法一:编写两个爬虫程序文件:爬虫1将豆瓣一周口碑榜的电影url添加到redis中名为movie_url的列表中(注意避免多次运行导致重复的问题);爬虫2从movie_url中读出网址,爬取每一部电影的导演、主演、类型、制片国家/地区、语言、上映日期、片长,并将它们保存到redis的hash表(自行命名)中。d......
  • 【爬虫】项目篇-爬取丁香园的疫情数据
    ```#编写程序,从丁香园获取国内近期疫情数据,按省份提取当前确诊数,#确诊总数,疑似病例数,治愈数,死亡数,高危数等数据,保存到csv文件或excel文件中。importrequestsimportxlsxwriterfromfake_useragentimportUserAgentimportcchardetimportreimportjsonfrombs4importBeautif......
  • 【爬虫】项目篇-爬取福州公交线路并保存至MongoDB
    #http://www.fz-bus.cn/index.asp#1)在MongoDB中创建一个数据库和一个集合。#2)在程序执行过程中可输入线路名称查询公交线路,#每查询到一条线路的信息后,查询MongoDB数据库中是否存在该线路。若存在,则不做任何操作,否则执行第3步。#将线路名称、起点和终点、途径站点、#冬季首......
  • 【爬虫】项目篇-爬取豆瓣电影周榜
    目录使用re爬取+为请求头,保存为csv使用re爬取2+不保存使用xpath+lxml.html+lxml.etree使用re爬取+为请求头,保存为csvimportrequestsimportreimportcsvfromfake_useragentimportUserAgent#re文档:#https://docs.python.org/zh-cn/3.8/library/re.html#re.Sheader=......
  • 【爬虫】项目篇-使用xpath爬取搜房网二手房信息
    #使用requests和xpath从搜房网上抓取福州地区的二手房房源信息#(要求获取所有分页上的房源,且每套房源包含标题、楼盘、#地点、经纬度、面积、房型、楼层、朝向、建筑年代、单价、总价、经纪人、联系电话等,缺数据的留空)。importrequestsfromlxmlimportetreefromfake_use......
  • 网页信息爬取
    网页信息爬取示例代码:importrequestsfrombs4importBeautifulSoupdefscrape_website(url):#发起GET请求并获取网页内容response=requests.get(url)#检查响应状态码,200表示请求成功ifresponse.status_code==200:#使用Beautif......
  • 某宝之店铺id与旺旺号爬虫爬取
    1.先上昨日(24-3-29)图ShopId:旺旺号文章正文:随着互联网的快速发展,大数据时代已经到来。在这个时代,数据成为了宝贵的资源,而如何高效、自动化地获取数据成为了许多企业和开发者关注的焦点。本文将详细介绍如何利用协议爬取、自动化技术与隧道代理相结合,轻松采集淘宝店铺信息......