scrapy的入门

news2024/12/23 20:52:47

今天我们先学习一下scrapy的入门,Scrapy是一个快速的高层次的网页爬取和网页抓取框架,用于爬取网站并从页面中提取结构化的数据。

1. scrapy的概念和流程

1.1 scrapy的概念

我们先来了解一下scrapy的概念,什么是scrapy:

Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。而框架就是把之前简单的操作抽象成一套系统,这样我们在使用框架的时候,它会自动的帮我们完成很多工作,我们只需要完成剩余部分

 Scrapy 使用了Twisted['twɪstɪd]异步网络框架,可以加快我们的下载速度。

Scrapy文档地址:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html

1.2. scrapy框架的作用

 少量的代码,就能够快速的抓取 ,框架是代码的半成品,提高效率(爬虫效率和开发效率)

scrapy框架是一个用于网络爬虫的快速、高层次的框架,它提供了一套丰富的功能,使得从网站上抓取数据变得简单和高效。

1. 3. scrapy的工作流程:

上面的流程可以改写为

 scrapy的流程 (可以理解为是3.2流程的抽象化流程)

以下是完整的对这个过程的解释:

1. 爬虫中起始的url构造成request对象-->爬虫中间件-->引擎-->调度器

2. 调度器把request-->引擎-->下载中间件--->下载器

3. 下载器发送请求,获取response响应---->下载中间件---->引擎--->爬虫中间件--->爬虫

4. 爬虫提取url地址,组装成request对象---->爬虫中间件--->引擎--->调度器,重复步骤2

5. 爬虫提取数据--->引擎--->管道处理和保存数据


1.3.1初始请求

用户在Scrapy项目中定义起始URL(通常是在spiders目录下的某个Spider类中)。

这些URL被转换为Request对象,这些对象被发送到Scrapy引擎。

在发送到引擎之前,这些Request对象会经过爬虫中间件(如果有定义的话)进行处理。

1.3.2调度器(Scheduler) 

调度好的Request被再次发送给引擎。

调度器根据优先级、重复过滤等因素对Request进行排序和调度。

引擎将Request对象发送给调度器。

1.3.3下载中间件(Downloader Middlewares)

引擎将Request对象发送给下载中间件(如果有定义的话)。

下载中间件可以对Request对象进行额外的处理,比如添加请求头、设置代理等。

处理后的Request对象被发送到下载器(Downloader)。

1.3.4下载器(Downloader)

下载器负责发送HTTP请求到目标网站。

下载器接收响应(Response对象),并将其发送回引擎。

在返回给引擎之前,响应会经过下载中间件(如果有定义的话),以便进行额外的处理,比如处理cookies、重试失败的请求等

1.3.5爬虫(Spiders)

  • 引擎将Response对象发送给对应的爬虫。
  • 爬虫解析Response对象,提取数据(通常是使用XPath、CSS选择器或正则表达式)。
  • 爬虫还可以提取新的URL,并生成新的Request对象。
  • 这些新的Request对象会经过爬虫中间件(如果有定义的话)发送到引擎。

1.3.6重复步骤2-5

对于爬虫提取的新URL,流程会重复步骤2-5,直到没有更多的URL需要处理或者满足某个停止条件(比如达到最大请求数、达到某个时间限制等)。

1.3.7管道(Pipelines)

爬虫提取的数据被发送到Item Pipeline(如果有定义的话)。

Item Pipeline负责处理这些数据,比如验证数据的完整性、清理HTML标签、将数据保存到数据库或文件系统等。

处理后的数据最终会被保存或丢弃,具体取决于Item Pipeline的实现。

1.3.8注意:

图中中文是为了方便理解后加上去的

 图中绿色线条的表示数据的传递

 注意图中中间件的位置,决定了其作用

 注意其中引擎的位置,所有的模块之前相互独立,只和引擎进行交互

1.4scrapy的三个内置对象

1.4.1.request请求对象:

Request对象代表一个HTTP请求,由Scrapy下载器中间件发送到互联网并等待服务器的响应。 

  • 它通常包含以下属性:
    • url(字符串):请求的URL。
    • method(字符串):HTTP请求方法(如"GET"或"POST")。
    • headers(字典):一个字典,包含HTTP头及其值。
    • body(字节串):请求体,用于POST或PUT请求。
    • meta(字典):用于在Scrapy引擎内部传递信息的字典。
    • cookies(字典或CookieJar):与请求一起发送的cookies。
    • 其他可能用于特定目的的属性。

1.4.2.response响应对象:

由url body status headers等构成

Response对象包含服务器对Request的响应。

它通常包含以下属性:

  • url(字符串):响应的URL(可能与请求的URL不同,例如由于重定向)。
  • status(整数):HTTP状态码(如200表示成功)。
  • headers(字典):包含HTTP响应头的字典。
  • body(字节串):响应体,即服务器返回的数据。
  • meta(字典):与产生该响应的Request对象中的meta相同。
  • request(Request对象):产生此响应的Request对象。
  • 其他可能用于特定目的的属性。

Scrapy还提供了选择器(Selectors)来方便地从Response对象中提取数据,如XPath和CSS选择器。 

1.4.3.item数据对象:

本质是个字典

  • Item对象用于收集爬虫从网页中提取的数据。
  • 它本质上是一个简单的Python字典,但提供了额外的功能,如字段验证和清理。
  • 你可以通过定义自己的Item类来指定爬虫将收集哪些数据。
  • 例如,如果你正在编写一个爬取电商网站信息的爬虫,你可能会定义一个ProductItem类,该类包含namepricedescription等字段。

在Scrapy中,你通常会定义一个或多个Item类来表示你想要从网站提取的数据结构。然后,在你的爬虫代码中,你可以创建这些Item类的实例,并将提取的数据填充到这些实例中。最后,这些Item实例将被Scrapy的管道(Pipeline)系统处理,可能包括清洗、验证和存储到数据库等操作。

 1.5 scrapy中每个模块的具体作用

注意:爬虫中间件和下载中间件只是运行逻辑的位置不同,作用是重复的:如替换UA等

2. scrapy的入门使用:

2.1 安装scrapy:

直接cmd安装:pip/pip3 install scrapy  

(换源安装命令:pip install scrapy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.comn )

安装依赖包:pip install pypiwin32

        如果不安装,以后的项目会报错

        window系统需要安装,Linux,Mac不需要

2.2 scrapy项目开发流程

2.2.1. 创建项目:

          scrapy startproject mySpider

2.2.2. 生成一个爬虫:

          scrapy genspider lianjia lianjia.com

2.2.3. 提取数据:

        根据网站结构在spider中实现数据采集相关内容

2.2.4. 保存数据:

        使用pipeline进行数据后续处理和保存

2.3. 创建项目:

通过命令将scrapy项目的的文件生成出来,后续步骤都是在项目文件中进行相关操作,下面以抓取链家来学习scrapy的入门使用

创建scrapy项目的命令:

scrapy startproject <项目名字>

示例:

        scrapy startproject myspider

2.4. 创建爬虫

通过命令创建出爬虫文件,爬虫文件为主要的代码文件,通常一个网站的爬取动作都会在爬虫文件中进行编写。

命令:

        **在项目路径下执行**:<br/>

        scrapy genspider <爬虫名字> <允许爬取的域名>

爬虫名字: 作为爬虫运行时的参数<br/>

允许爬取的域名:

为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。

示例:

cd myspider       ***这一步是进入当前项目路径***

scrapy genspider lianjia lianjia.com        ***再创建爬虫文件***

2.4.1,scrapy.cfg

详细项目配置文件, 不需要做改动

2.4.2,items.py  定义数据存储模型

# Define here the models for your scraped items

# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

# 实际是一个模板类  主要是用来定义数据存储模型
# 通过这个类实例化 数据实际存到实例(对象)中
class MyspiderItem(scrapy.Item):
    # 实际是一个模板类(数据建模) 事先定义好你要爬取的字段
    name = scrapy.Field()  # 租房标题
    content = scrapy.Field() # 详情信息
    price = scrapy.Field()  # 价格
    link = scrapy.Field() # 详情链接

2.4.3,middlewares.py   用于编写中间件(下载中间件+爬虫中间件) -- 无特殊需求,一般不需要编写

# Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html

from scrapy import signals

# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter


class MyspiderSpiderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        # Called for each response that goes through the spider
        # middleware and into the spider.

        # Should return None or raise an exception.
        return None

    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.

        # Must return an iterable of Request, or item objects.
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):
        # Called when a spider or process_spider_input() method
        # (from other spider middleware) raises an exception.

        # Should return either None or an iterable of Request or item objects.
        pass

    def process_start_requests(self, start_requests, spider):
        # Called with the start requests of the spider, and works
        # similarly to the process_spider_output() method, except
        # that it doesn’t have a response associated.

        # Must return only requests (not items).
        for r in start_requests:
            yield r

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)


class MyspiderDownloaderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        return None

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

2.4.4,lianjia.py (爬虫文件,文件名称自己定义)  [后面再来完善该爬虫模块]

import scrapy

class LianjiaSpider(scrapy.Spider):
    # 爬虫名字
    name = 'lianjia'
    # 限定爬取的域名范围
    allowed_domains = ['cs.lianjia.com']
    # 起始请求的URL
    start_urls = ['https://cs.lianjia.com/zufang/']
    
    # 该方法会接受下载中间件传过来的response,并对其进行解析
    def parse(self, response):
        pass

2.4.5,pipelines.py   管道 -- 主要用于编写数据处理步骤 (数据的清洗+保存)

# Define your item pipelines here

# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html

# useful for handling different item types with a single interface
from itemadapter import ItemAdapter

class MyspiderPipeline:
    def process_item(self, itemder):
        return item

2.4.6,settings.py   详细的配置信息(设置文件UA  并启动管道)

# Scrapy settings for mySpider project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'mySpider'

SPIDER_MODULES = ['mySpider.spiders']
NEWSPIDER_MODULE = 'mySpider.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
# 需要手动修改成自己浏览器的UA
USER_AGENT = 'mySpider (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False # 需要手动修改为False

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# Override the default request headers:
# 可以写入一些爬虫所需要的身份信息
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}

# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
# SPIDER_MIDDLEWARES = {
#    'mySpider.middlewares.MyspiderSpiderMiddleware': 543,
# }

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'mySpider.middlewares.MyspiderDownloaderMiddleware': 543,
#}

# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html

#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 开启管道类才能写入数据
ITEM_PIPELINES = {
   'mySpider.pipelines.MyspiderPipeline': 300,
}

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

2.5. 完善爬虫

在上一步生成出来的爬虫文件中编写指定网站的数据采集操作,实现数据提取

2.5.1 在/myspider/myspider/spiders/itcast.py中修改内容如下:

import scrapy
from mySpider.items import MyspiderItem

class LianjiaSpider(scrapy.Spider):
    # 爬虫名字
    name = 'lianjia'
    # 限定爬取的域名范围
    allowed_domains = ['cs.lianjia.com']
    # 起始请求的URL
    start_urls = ['https://cs.lianjia.com/zufang/']

    # 该方法会接受下载中间件传过来的response,并对其进行解析
    def parse(self, response):
        # print("响应对象:",response)  # response是一个响应对象
        # html_data = response.body  # 获取网页源码
        # print("源码信息:", html_data)
        # # 将获取回来的网页源码保存为本地html文件,方便做分析
        # with open('lj.html','wb')as f:
        #     f.write(html_data)
        # 正式解析想要的数据
        # 会返回一个为列表的Selector选择器对象
        # 将列表遍历成字符串再通过.extract()取选择器里的所有值,.extract_first()取出选择器里的第一个值
        name = response.xpath(
            '//div[@class="content__list--item--main"]//p[@class="content__list--item--title"]/a/text()').extract()
        price = response.xpath('//div[@class="content__list--item--main"]//em/text()').extract()
        link = response.xpath('//div[@class="content__list--item--main"]//a[@class="twoline"]/@href').extract()
        for names, prices, links in zip(name, price, link):
            # 创建一个数据字典
            # item = {}
            # 调用items模板类
            item = MyspiderItem()  #实例化之后可以直接使用 目前是一个空字典
            # 给实例之后的空字典组建数据 要注意得与items文件中定义的变量一致
            item["name"] = names.strip()
            item["price"] = prices
            item["link"] = "https://cs.lianjia.com/" + links
            # print(names.strip())
            # print(prices)
            # print("https://cs.lianjia.com/"+links)
            # print('=='*10)
            # print(item)
            
            # 将组建好的dict形式数据通过yield返回给引擎 再交给管道文件Pipeline
            yield item

注意:

- scrapy.Spider爬虫类中必须有名为parse的解析

- 如果网站结构层次比较复杂,也可以自定义其他解析函数

- 在解析函数中提取的url地址如果要发送请求,则必须属于allowed_domains范围内,但是start_urls中的url地址不受这个限制,我们会在后续的课程中学习如何在解析函数中构造发送请求

- 启动爬虫的时候注意启动的位置,是在项目路径下启动

- parse()函数中使用yield返回数据,

注意:解析函数中的yield能够传递的对象只能是:BaseItem, Request, dict, None

2.5.2 定位元素以及提取数据、属性值的方法

解析并获取scrapy爬虫中的数据: 利用xpath规则字符串进行定位和提取

1. response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法

2. 额外方法extract():返回一个包含有字符串的列表

3. 额外方法extract_first():返回列表中的第一个字符串,列表为空没有返回None

2.6 保存数据

 利用管道pipeline来处理(保存)数据

2. 6.1 在pipelines.py文件中定义对数据的操作

1. 定义一个管道类

2. 重写管道类的process_item方法

3. process_item方法处理完item之后必须返回给引擎

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html

# useful for handling different item types with a single interface
import json

from itemadapter import ItemAdapter

class MyspiderPipeline:
    def __init__(self):
        self.file = open('lianjia.json','w')

    # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
    # 该方法为固定名称函数
    def process_item(self, item, spider):
        # 参数item默认是一个 <class 'mySpider.items.MyspiderItem'>类信息,需要处理成字典
        dict_data = dict(item)
        print(type(item), type(dict_data))
        # 将返回的字典数据转为JSON数据
        json_data = json.dumps(dict_data,ensure_ascii=False)+',\n'
        # 写入JSON数据
        self.file.write(json_data)
        # 参数item:是爬虫文件中yield的返回的数据对象(引擎会把这个交给管道中的这个item参数)
        print("建模之后的返回值:",item,)
        # 默认使用完管道之后将数据又返回给引擎
        return item

    def __del__(self):
        self.file.close()

2. 6.2 在settings.py配置启用管道

#   设置目录文件               该值的大小决定管道执行的顺序,值越小优先级越高(该值最好 不要大于1000)  

ITEM_PIPELINES = {

   'mySpider.pipelines.MyspiderPipeline': 300,

}

以上配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。

配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。

2.7. 运行scrapy

命令:在项目目录下执行scrapy crawl <爬虫名字>

示例:scrapy crawl 爬虫名字 --nolog 忽略日志信息

2.7.1  也可爬虫项目中执行命令

每次我们写完代码进行测试的时候,都要去安装目录执行,所以为了方便,我们要写一个再爬虫项目根目录中创建.py结尾的文件,执行以下指令:

from scrapy import cmdline
cmdline.execute(['scrapy','crawl','lianjia'])

2. 8,Scrapy Shell的使用

我们想要爬虫中使用xpath,BS4,正则,css选择器等来提取想要的数据时,由于Scrapy是一个重量级框架,每次运行起来都要等待一段时间,因此要去验证我们书写的规则是否正确,是一个比较麻烦的事情,因此Scrapy提供了一个shell,用起来方便测试规则

打开Scrapy Shell

打开cmd终端,进入到Scrapy项目所在目录,进入到Scrapy框架所在的环境中,输入命令:

 scrapy shell url ,就会进入到scrapy的shell环境中,在这个环境中,你可以跟在爬虫的parse方法中一样使用了

例如:

   cd mySpider  进入项目路径

   scrapy shell https://cs.lianjia.com/zufang/  #想要测试的url

   link = response.xpath('//div[@class="content__list--item--main"]//a[@class="twoline"]/@href').extract()

2. 9. 翻页请求的思路

对于要提取如下图中所有页面上的数据该怎么办?

![image.png](attachment:image.png)

回顾requests模块是如何实现翻页请求的:

1. 找到下一页的URL地址

2. 调用requests.get(url)

scrapy实现翻页的思路:

(scrapy并无单独的url这个概念,scrapy中都是需要将url打包成一个请求对象)

1. 找到下一页的url地址

2. 把url地址构造成请求对象,传递给引擎

2.10.如何构造Request对象,并发送请求

2.10.1 实现方法

1. 确定url地址

2. 构造请求,scrapy.Request(url,callback)

   - callback:指定响应体解析的函数名称,表示该请求返回的响应使用哪一个函数进行解析(callback不赋值的话默认是给parse方法解析)

3. 把请求交给引擎:yield scrapy.Request(url,callback)

2.10.2 链家爬虫

通过爬取链家页面信息,学习如何实现翻页请求

 地址:https://xy.lianjia.com/zufang/pg1/

思路分析:

1. 获取首页的响应数据(因为里面有我们想要的翻页链接)

2. 寻找下一页的地址,进行翻页,获取数据

2.10.3 代码实现

在爬虫文件的parse方法中:

        # 开始构造翻页
        # 1,提取下一页url
        all_url = response.xpath('//ul[@style="display:hidden"]//li/a/@href').extract()
        print(all_url)
        for part_url in all_url:
            # 2,判断条件
            if '/zufang/' in part_url:
                next_url = response.urljoin(part_url)
                print("下一页参数信息:", part_url)
                print("下一页链接:", next_url)
                # 构建请求对象 并且返回给引擎
                yield scrapy.Request(url=next_url,callback=self.parse)

 

3.小结

1. scrapy的安装:pip install scrapy

2. 创建scrapy的项目: scrapy startproject myspider

3. 创建scrapy爬虫:在项目目录下执行 scrapy genspider lianjia  lianjia.com

4. 运行scrapy爬虫:在项目目录下执行scrapy crawl 爬虫名字     【scrapy crawl 爬虫名字 --nolog 忽略日志信息】

5. 解析并获取scrapy爬虫中的数据:

   1. response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法

   2. extract() 返回一个包含有字符串的列表

   3. extract_first() 返回列表中的第一个字符串,列表为空没有返回None

6. scrapy管道的基本使用:

   1. 完善pipelines.py中的process_item方法

   2. 在settings.py中设置开启pipeline

7. response响应对象的常用属性

   1. response.url:获取当前响应的url地址

   2. response.request.url:获取当前响应对应的请求的url地址

   3. response.headers:获取响应头

   4. response.urljoin(url) :用于构造绝对url, 当传入的url参数是一个相对地址时, 根据response.url计算出相应的绝对url.

   5. response.body:获取响应体,也就是html代码,byte类型

   6. response.text: 获取响应体,str类型

   7. response.status:获取响应状态码

8. request请求对象的常用属性

   1. request.url(必选):请求页面的url地址,bytes或str类型。

   2. request.callback:页面解析函数,Callback类型,Request请求对象的页面下载完成后,由该参数指定的页面解析函数解析页面,如果未传递该参数,默认调用Spider的parse方法。

   3. request.method:HTTP请求的方法,默认为‘GET’。

   4. request.headers:HTTP请求的头部字典,dict 类型。

   5. request.meta:Request 的元数据字典,dict 类型,用于给框架中其他组件传递信息,比如中间件 Item Pipeline。其他组件可以使用Request 对象的 meta 属性访问该元数据字典 (request.meta), 也用于给响应处理函数传递信息。

   6. request.encoding:url 和 body 参数的编码默认为'utf-8'。如果传入的url或body参数是str 类型,就使用该参数进行编码。

   7. request.dont_filter:默认情况下(dont_filter=False),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤(避免重复下载)。如果将该参数置为True,可以使请求避免被过滤,强制下载。例如:在多次爬取一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数设置为True。

结语:

今天给大家分享的是关于scrapy的初级入门学习,由于这篇的篇幅比较长所有我更新的比较慢,希望大家见谅.这些都是我自己的学习过程中的一些笔记欢迎大家的指正和欢迎大家在评论区和谐讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1666021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【userfaultfd+条件竞争劫持modprobe_path】TSGCTF 2021 -- lkgit

前言 入门题&#xff0c;单纯就是完成每日一道 kernel pwn 的 kpi &#x1f600; 题目分析 内核版本&#xff1a;v5.10.25&#xff0c;可以使用 userfaultfd&#xff0c;不存在 cg 隔离开启了 smap/smep/kaslr/kpti 保护开启了 SLAB_HADNERN/RANDOM 保护 题目给了源码&…

HarmonyOS NEXT星河版之模拟图片选择器(下)---使用Swiper实现图片滑动预览

文章目录 一、目标二、开撸2.1 改造图片预览Dialog2.2 改造主页面2.3 主页面完整代码 三、小结 一、目标 在前面的介绍中&#xff0c;查看选中的图片都是单张预览&#xff0c;接下来要改造成多张可滑动预览&#xff0c;如下&#xff1a; 二、开撸 2.1 改造图片预览Dialog …

【c++】set、map用法详解

set、map用法详解 1. 关联式容器2. 键值对2.1 &#xff1a;pair2.2&#xff1a;make_pair 3. 树形结构的关联式容器3.1&#xff1a;set构造函数find()erase()insert()count()lower_bound()upper_bound() 3.2&#xff1a;multiset3.3&#xff1a;map构造函数insert()operator[] …

如何在bud里弄3d模型?---模大狮模型网

随着数字化设计的不断发展&#xff0c;越来越多的设计软件提供了对3D模型的支持&#xff0c;为设计师们带来了更广阔的创作空间。Bud作为一款功能强大的设计工具&#xff0c;也提供了添加和编辑3D模型的功能&#xff0c;让用户能够更加灵活地进行设计创作。本文将为您详细介绍如…

最新网页版USB转串口芯片CH340中文规格书手册(20240511)

前言 南京沁恒的产品已经很成熟了&#xff0c;完全可替代国外USB转串口产品&#xff0c;不必迷信FT232&#xff0c;CP2102之类了。 另外&#xff0c;急着买芯片&#xff0c;直接跑过去的&#xff0c;看过几次妹子了:) CH340手册&#xff0c;基于网页3.3版本&#xff0c;规格书…

ARM单片机实现流水灯(GD32)

根据上图可知使用的引脚分别是PA8,PE6,PF6流水灯功能的实现要分别初始化这几个引脚 流水灯实现 编写流水灯代码 LED.C #include "gd32f30x.h" // Device header #include "Delay.h" // 初始化LED灯 void LED_Init(void){// 使能RCU时钟…

正点原子FreeRTOS学习笔记——列表与列表项

目录 一、什么是列表和列表项 1、概念 2、FreeRTOS代码 &#xff08;1&#xff09;列表 &#xff08;2&#xff09;列表项 &#xff08;3&#xff09;迷你列表项 二、列表与列表项初始化 1、列表初始化 2、列表项初始化 三、列表插入与删除列表项 1、原理解释 2、…

2024.1IDEA 到2026年

链接&#xff1a;https://pan.baidu.com/s/1hjJEV5A5k1Z9JbPyBXywSw?pwd9g4i 提取码&#xff1a;9g4i解压之后,按照 操作说明.txt 操作; IntelliJ IDEA 2024.1 (Ultimate Edition) Build #IU-241.14494.240, built on March 28, 2024 Licensed to gurgles tumbles You have…

如何给扫描好的3d模型贴图?---模大狮模型网

在数字化设计领域&#xff0c;3D模型的贴图是提升模型逼真度和视觉效果的重要步骤之一。尤其是对于扫描好的3D模型&#xff0c;通过添加适当的贴图&#xff0c;不仅可以增强模型的细节和真实感&#xff0c;还可以为设计带来更加生动的视觉体验。本文将为您详细介绍如何给扫描好…

探索全画面塑料焊接透光率检测仪的科技魅力

在精密工业和科研领域中&#xff0c;对材料的光学性能有着严格的要求。全画面塑料焊接透光率检测仪是一种先进的设备&#xff0c;它能够精确测量塑料焊接接头的透光率&#xff0c;确保焊接质量符合高标准。本文将详细介绍这一设备的特点、工作原理以及它在实际应用中的重要性。…

【Vue基础】Vue在组件数据传递详解

Vue核心基础-CSDN博客 先回顾Vue特性&#xff1a; Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;具有许多强大的特性。以下是一些主要的 Vue 特性&#xff1a; 响应式数据&#xff1a;Vue 使用双向绑定来实现数据的响应式更新。当数据发生变化时&#xff0c;视图会自…

LLM一些适合小白的入门项目和视频

AIX 大模型专区学习&#xff08;史上最丰富&#x1f973;&#xff09; https://github.com/stay-leave/enhance_llm 图谱大哥五一写得。 【对于卷积神经网络&#xff0c;硕士博士不需要搞明白原理&#xff0c;只要会应用是这样吗&#xff1f;-pytorch/深度学习/神经网络】 htt…

draw.io 网页版二次开发(3):打包和部署(war包)

目录 一 说明 二 环境配置 1. 下载并安装 Apache Ant 2. 下载并安装JDK和JRE 3. 下载tomcat 4. Ant、JDK和JRE 环境变量的配置 三 draw.io打包 四 部署 五 最后 一 说明 应公司项目要求&#xff0c;需要对draw.io进行二次开发&#xff0c;并将html界面通过iframe 嵌…

超详细的胎教级Stable Diffusion使用教程(四)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC&#xff08;实时时钟&#xff09;不仅仅提供计数功能&#xff0c;它是一个完整的时钟和日历模块&#xff0c;用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息&#xff0c;并且通常具有闹钟功能&#xff0c;可以用于定时唤醒或触发事件。…

淘宝购物新玩法,用API接口解读商品评价

淘宝作为中国最大的网络购物平台之一&#xff0c;拥有海量的商品和众多的消费者评价。传统的购物方式往往需要花费大量的时间和精力筛选信誉度高的商品和有用的评价&#xff0c;而如今&#xff0c;联讯数据通过API接口&#xff0c;你可以更轻松地解读商品评价&#xff0c;挖掘出…

设施农业(大棚种植)远程监控系统设计 STM32+51单片机 含pcb 上下位机源码 原理图

目录 摘要 1. 引言 2. 系统方案 3. 系统硬件设计 4. 系统软件设计 5. 系统创新 6. 评测与结论 7、实物图 8、原理图 ​9、程序 10、资料内容 资料下载地址&#xff1a;设施农业(大棚种植)远程监控系统设计 STM3251单片机 含pcb 上下位机源码 原理图 论文 摘要 …

如何根据招聘信息打造完美简历

如何根据招聘信息打造完美简历 招聘信息分析简历调整策略个性化与关键词结语 在求职过程中&#xff0c;简历是第一块敲门砖。它不仅展示了你的专业技能和工作经验&#xff0c;还体现了你对所申请职位的理解和热情。然而&#xff0c;如何从招聘信息中提炼关键点&#xff0c;打造…

halcon 2D模板匹配 3D

一、概述 模板匹配常用于定位和查找&#xff0c;有很多的方式&#xff0c;halcon 中就有灰度匹配 、形状匹配、变形匹配、缩放匹配等&#xff0c;其实最常用的还是两种第一个就是灰度匹配、还有就是形状匹配 二、金字塔概述 网上有很多关于金字塔的解释&#xff0c;我这里直…

OpenHarmony 实战开发——轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 &#xff0c;进行轻量带屏开发板的标准移植&#xff0c;开发了智能开关面板样例&#xff0c;同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内…