Code前端首页关于Code前端联系我们

scrapy

terry 2年前 (2023-09-24) 阅读数 64 #后端开发

中的数据采集日志管理与原始爬虫代码的不同之处在于,scrapy是一个相对成熟的框架,因此它无法直接运行给定的Python文件来执行采集任务,而必须使用脚本命令来实现。计划启动。

1。 scrapy的步骤及代码实现简述

1.1 创建scrapy项目

scrapy启动项目 YourProjectName

首先打开终端(本文以pycharm中的终端为例),然后运行创建中所需的项目的文件夹。如上图所示输入命令scrapy中的数据采集日志管理

后,您可以在上图所示的文件夹中看到新创建的项目文件夹。 ?第一个参数是创建的爬虫作业名称,第二个参数是访问域名(可以随便填)。回车后,你会在项目文件夹的spiders文件夹中看到刚刚创建的爬虫文件。 scrapy中的数据采集日志管理

双击打开,如下: scrapy中的数据采集日志管理

接下来我们以某个带有图片的网站为例进行说明。

先将要访问的目标地址添加到起始URL列表中,然后在parse方法中直接输出响应即可查看响应结果。

# spiders.py
import scrapy
​
​
class Spider01Spider(scrapy.Spider):
    name = "spider01"
    allowed_domains = ["xxx.com"]
    start_urls = ["https://sc.chinaz.com/tupian/siwameinvtupian.html"]
​
    def parse(self, response):
        print(response)

注意:此时不要开始完成任务。首先,转到配置文件 settings.py 并进行一些更改。

# 第一处变化,添加scrapy中请求时的默认UA
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
​
# Obey robots.txt rules
# 第二处变化,将True改为False,表示访问时不按照君子协议进行数据采集
ROBOTSTXT_OBEY = False
# 第三处变化,添加参数LOG_LEVEL,值为ERROR,表示设置项目中日志等级为ERROR,添加后项目启动后只会显示错误信息,其他的调试信息不会再输出
LOG_LEVEL = 'ERROR'

然后就可以启动并运行项目了

scrapy爬行spiderNamescrapy中的数据采集日志管理

可以看到响应和请求返回了一个响应对象,这意味着我们可以从Response文本属性对象中检索它。但需要注意的是,scrapy中的响应对象在获取字节类型数据时使用的是body而不是content。 scrapy中的数据采集日志管理

1.3 scrapy 中的 XPath 解析

与原代码不同的是,scrapy 框架中的 XPath 解析器是直接封装在框架中的,所以使用时不需要导入,直接通过响应对象response 只需调用它即可。scrapy中的数据采集日志管理

可以看到这里返回的并不是直观的分析内容,而是一个选择器-选择器对象。如果想要获取数据值,需要使用extract()、extract_first()、get()。 getall()方法用于提取,包括extract()方法getall()方法用于提取所有成功链接的数据,即,只要列表中有多个选择器对象。从不同的选择器对象中提取数据。 extract_first()get() 提取列表中的第一个数据。这里不再演示,自行测试即可。

2。 scrapy翻页控制

scrapy翻页控制代码与原代码不同,但原理是一样的:先找到下一页的URL,然后发起请求。

三种翻页方式:

# 1.将多个URL置于起始URL列表之中
start_urls = ["https://sc.chinaz.com/tupian/siwameinvtupian.html",
                  "https://sc.chinaz.com/tupian/siwameinvtupian_2.html",
                  "https://sc.chinaz.com/tupian/siwameinvtupian_3.html"]使用response.follow实现翻页
# 2.使用response.follow实现翻页
import scrapy
​
​
class Spider01Spider(scrapy.Spider):
 name = "spider01"
 allowed_domains = ["chinaz.com"]
 start_urls = ["https://sc.chinaz.com/tupian/siwameinvtupian.html"]
​
 def parse(self, response):
 print(response)
 # print(response.body.decode())
 # title = response.xpath('/html/body/div[3]/div[2]/div[1]/div/a/@title').getall()
 # print(title)
 next_page = "https://sc.chinaz.com/tupian/" + response.xpath('//*[@class="nextpage"]/@href').extract_first()
 print(next_page)
 yield response.follow(url=next_page, callback=self.parse)
# 如此翻页会直到最后一页的时候才会停下,follow方法中的url即为解析到的下一页的url,callback表示的是回调的方法,此处即回调到parse方法。如果需要停止,则添加控制参数即可。

# 3.构造手动请求对象,与follow类似,在拿到下一页的URL之后构造新的手动请求对象。
import scrapy
​
​
class Spider01Spider(scrapy.Spider):
 name = "spider01"
 allowed_domains = ["chinaz.com"]
 start_urls = ["https://sc.chinaz.com/tupian/siwameinvtupian.html"]
 page = 1
​
 def parse(self, response):
 print(response)
 # print(response.body.decode())
 # title = response.xpath('/html/body/div[3]/div[2]/div[1]/div/a/@title').getall()
 # print(title)
 next_page = "https://sc.chinaz.com/tupian/" + response.xpath('//*[@class="nextpage"]/@href').extract_first()
 # print(next_page)
 if self.page < 3:   # 共3页
 self.page += 1
 yield response.follow(url=next_page, callback=self.parse) # 构造手动请求对象
# 与follow类似,在拿到下一页的URL之后构造新的手动请求对象。
import scrapy
​
​
class Spider01Spider(scrapy.Spider):
 name = "spider01"
 allowed_domains = ["chinaz.com"]
 start_urls = ["https://sc.chinaz.com/tupian/siwameinvtupian.html"]
 page = 1
​
 def parse(self, response):
 print(response)
 # print(response.body.decode())
 # title = response.xpath('/html/body/div[3]/div[2]/div[1]/div/a/@title').getall()
 # print(title)
 next_page = "https://sc.chinaz.com/tupian/" + response.xpath('//*[@class="nextpage"]/@href').extract_first()
 # print(next_page)
 if self.page < 3:   # 共3页
 self.page += 1
 # yield response.follow(url=next_page, callback=self.parse)
 yield scrapy.Request(url=next_page, callback=self.parse)    # 构建手动请求对象
# 手动请求对象的构建方式适用于详情页的数据解析。此处不再详讲。

3. scrapy中的日志管理

日志是记录项目运行过程中每一次操作的记录文本,记录操作信息,包括异常、警告、输入条目等。

3.1 日志级别

Python内置的日志记录定义了 5 个不同的级别来指示特定日志消息的严重性。以下是默认日志记录级别(按降序排列):

  1. logging.CRITICAL - 用于严重错误(最高严重性)
  2. logging.ERROR - 用于一般错误
  3. logging.WARNING - 用于警告消息
  4. http: //logging.INFO - 用于信息性消息
  5. logging.DEBUG - 用于调试消息(最低严重性)

3.2 日志记录消息

import logging
logging.warning('This is a warning')

在默认的 5 个级别中,一个用于发布日志消息的快捷方式,是还有一个常规的logging.log方法,它将给定的级别作为参数。如果需要,最后一个示例可以重写为:

import logging
logging.log(logging.WARNING, "This is a warning")

此外,可以创建各种“记录器”来封装消息。 (例如,通常为每个模块创建不同的记录器)。这些记录器可独立配置并启用层次结构。

上一个示例使用了后台根记录器,它是传递所有消息的顶级记录器(除非另有说明)。使用日志记录助手只是显式获取根记录器的快捷方式,因此这也与最后一段代码相同:

import logging
logger = logging.getLogger()
logger.warning('This is a warning')

您可以使用不同的记录器,只需将其命名为logging.getLogger 功能:

import logging
logger = logging.getLogger('mycustomlogger')
logger.warning("This is a warning")

3.3日志配置

以下参数配置方式与刚刚添加的LOG_LEVEL相同。参数如下:

LOG_FILE :用于日志记录输出的文件名
​
LOG_FILE_APPEND :如果False指定的日志文件LOG_FILE将被覆盖(如果有,则丢弃以前运行的输 出)
​
LOG_ENABLED :是否启用日志记录,默认True
LOG_ENCODING :用于日志记录的编码
LOG_LEVEL :要记录的最低级别。可用级别包括:严重、错误、警告、信息、调试
LOG_FORMAT :用于格式化日志消息的字符串。
LOG_DATEFORMAT :用于格式化日期/时间的字符串
LOG_STDOUT :默认为False,如果为True,进程的所有标准输出(和错误)都将重定向到日志
LOG_SHORT_NAMES :默认False,如果为True,日志只包含根路径。如果设置为False然后显示负责日志输出的组件

其余参数参见scrapy官方文档

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门