文章目录
- 前言
- python Scrapy 框架 demo
- 1. 安装
- 2. 百度热搜爬取demo
- 2.1. 初始化项目
- 2.2. 修改 items.pyitems.py
- 2.3. 创建 spiders/baidu_spider.py
- 2.4. 修改 pipelines.py
- 2.5. 修改 settings.py
- 3. settings.py 相关配置说明
- 4. 启动爬虫测试
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
python Scrapy 框架 demo
1. 安装
安装 Scrapy
首先,确保你已经安装了 Scrapy,可以使用 pip 进行安装:
pip install scrapy
验证 Scrapy 是否安装成功
成功安装 Scrapy 后,运行以下命令验证:
scrapy version
2. 百度热搜爬取demo
2.1. 初始化项目
首先,启动一个 Scrapy 项目:
scrapy startproject baidu_hots
初始后的项目结构:
结构说明:
baidu_hots/ ----外层目录
├── baidu_hots/ ----Scrapy框架的用户自定义python代码
│ ├── __init__.py
│ ├── items.py ----Items代码模板(继承类)
| ├── middlewares.py ----Middlewares代码模板(继承类)(扩展功能)
│ ├── pipelines.py ----代码模版(继承类)
│ ├── settings.py ----scrapy爬虫的配置文件
│ └── spiders/ ----代码模板(继承类)
│ ├── __init__.py
├── scrapy.cfg ----部署scrapy爬虫的配置文件
2.2. 修改 items.pyitems.py
用于定义我们将爬取的数据结构:
import scrapy
"""
用于定义我们将爬取的数据结构:
"""
class BaiduHotsItem(scrapy.Item):
rank = scrapy.Field()
title = scrapy.Field()
2.3. 创建 spiders/baidu_spider.py
在 spiders/ 目录下创建一个爬虫文件 baidu_spider.py
import scrapy
from baidu_hots.items import BaiduHotsItem
import pdb # 导入调试库
from scrapy.spidermiddlewares.httperror import HttpError
class BaiduSpider(scrapy.Spider):
name = 'baidu_hots'
allowed_domains = ['top.baidu.com']
start_urls = ['https://top.baidu.com/board?platform=pc&sa=pcindex_entry']
def parse(self, response):
hot_search_items = response.css('div.active-item_1Em2h')
for item in hot_search_items:
rank = item.css('div.sign-index_mtI7K::text').get()
title = item.css('div.c-single-text-ellipsis::text').get()
# pdb.set_trace() # 设置断点
if rank is None or rank.strip() == "":
continue
if rank and title:
baidu_item = BaiduHotsItem()
baidu_item['rank'] = rank.strip()
baidu_item['title'] = title.strip()
yield baidu_item
def errback_httpbin(self, failure):
# 错误时进入此处
self.logger.error(repr(failure))
# 可以通过 failure 检查异常类型
if failure.check(HttpError):
response = failure.value.response
self.logger.error(f'HttpError on {response.url}')
2.4. 修改 pipelines.py
pipelines.py 文件可以用来处理抓取到的数据(例如,保存到数据库或文件):
class BaiduHotsPipeline:
def process_item(self, item, spider):
print(f"【{item['rank']}】 {item['title']}")
return item
2.5. 修改 settings.py
BOT_NAME = "baidu_hots"
SPIDER_MODULES = ["baidu_hots.spiders"]
NEWSPIDER_MODULE = "baidu_hots.spiders"
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {
"baidu_hots.pipelines.BaiduHotsPipeline": 300,
}
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
LOG_ENABLED = True
LOG_LEVEL = 'INFO' # 可以改为 DEBUG 来查看详细的调试信息
LOG_FILE = 'scrapy_log.txt'
3. settings.py 相关配置说明
项目和模块相关配置
BOT_NAME = “baidu_hots”: 定义你的 Scrapy 项目的名称。在 Scrapy 中,项目名通常被用于标识爬虫和某些自动生成的路径。
SPIDER_MODULES = [“baidu_hots.spiders”]: 告诉 Scrapy 爬虫(spider)模块存放的路径,通常会在项目的 spiders 文件夹中。
NEWSPIDER_MODULE = “baidu_hots.spiders”: 创建新的爬虫时,Scrapy 会自动将爬虫生成在这个模块下。
请求和响应相关配置
ROBOTSTXT_OBEY = True: 是否遵守 robots.txt 文件。robots.txt 是网站管理员用于指示爬虫哪些内容是允许爬取的,设置为 True 则遵守这些规则。
CONCURRENT_REQUESTS = 16: 同时处理的最大请求数量,默认值是 16。如果需要更多并发请求,可以调高此值。
DOWNLOAD_DELAY = 3: 设置每个请求之间的延迟(以秒为单位),避免对目标站点造成压力。默认没有延迟,可以根据需要调整。
CONCURRENT_REQUESTS_PER_DOMAIN = 16 和 CONCURRENT_REQUESTS_PER_IP = 16: 分别指定对每个域名或每个 IP 的最大并发请求数。如果需要爬取大量内容,可以增加这个值。
Cookies 和调试相关配置
COOKIES_ENABLED = False: 是否启用 Cookies。默认是启用的。如果不需要 Cookies,可以设置为 False 以禁用。
TELNETCONSOLE_ENABLED = False: 是否启用 Telnet 控制台。默认是启用的,但大多数项目中不需要这个功能,设置为 False 关闭。
请求头相关配置
DEFAULT_REQUEST_HEADERS: 设置默认的请求头,这里通常会设置 User-Agent 和 Accept-Language。这个配置项被注释掉了,说明它使用默认请求头。如果需要自定义,可以启用并设置。
爬虫和下载中间件配置
SPIDER_MIDDLEWARES 和 DOWNLOADER_MIDDLEWARES: 用于启用或禁用特定的爬虫或下载中间件。中间件是拦截和处理请求与响应的特殊组件。你可以通过修改这些项来添加、删除或修改中间件。
Item 管道相关配置
ITEM_PIPELINES = {“baidu_hots.pipelines.BaiduHotsPipeline”: 300}: 用于配置 Item 管道。这里启用了 BaiduHotsPipeline 管道,并且优先级为 300。Scrapy 中多个管道可以有不同的优先级,数值越低优先级越高。
自动限速(AutoThrottle)配置
AUTOTHROTTLE_ENABLED = True: 是否启用自动限速功能。这个功能可以自动根据服务器的响应速度调整爬取速度,避免对服务器造成过大压力。
AUTOTHROTTLE_START_DELAY = 5: 初始的下载延迟时间。开启 AutoThrottle 后,Scrapy 会在每次请求间隔时动态调整这个值。
AUTOTHROTTLE_MAX_DELAY = 60: 最大下载延迟时间。如果服务器响应非常慢,延迟可以增加到这个值。
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0: 设置 Scrapy 试图在目标服务器上保持的并发请求数。
HTTP 缓存相关配置
HTTPCACHE_ENABLED = True: 是否启用 HTTP 缓存。启用后,Scrapy 会缓存请求的响应数据,以便在多次运行时重用,减少对目标服务器的请求。
HTTPCACHE_EXPIRATION_SECS = 0: 缓存的过期时间,以秒为单位。0 表示不会过期。
HTTPCACHE_DIR = “httpcache”: 缓存存放的目录。
HTTPCACHE_IGNORE_HTTP_CODES = []: 指定哪些 HTTP 响应代码不应该被缓存,比如你可以忽略 404 错误。
HTTPCACHE_STORAGE = “scrapy.extensions.httpcache.FilesystemCacheStorage”: 指定缓存存储的方式。这里使用的是文件系统缓存。
日志相关配置
LOG_ENABLED = True: 是否启用日志。设置为 True 启用日志输出。
LOG_LEVEL = ‘INFO’: 日志级别。可以设置为 DEBUG、INFO、WARNING、ERROR、CRITICAL。你目前设置为 INFO,如果需要更多调试信息,可以设置为 DEBUG。
LOG_FILE = ‘scrapy_log.txt’: 指定日志文件的路径。如果不指定,日志会输出到控制台。这里将日志输出到 scrapy_log.txt 文件。
其他配置
REQUEST_FINGERPRINTER_IMPLEMENTATION = “2.7”: 使用最新的请求指纹算法(自 Scrapy 2.7 开始提供)。这个算法用于为每个请求生成唯一的指纹以避免重复爬取。
TWISTED_REACTOR = “twisted.internet.asyncioreactor.AsyncioSelectorReactor”: 使用 AsyncioSelectorReactor 作为 Scrapy 的事件循环机制,提供异步支持。
FEED_EXPORT_ENCODING = “utf-8”: 输出的文件编码设置为 utf-8。
4. 启动爬虫测试
scrapy crawl <spider_name>
其中<spider_name> 是你在爬虫文件中定义的爬虫名称,通常在爬虫类中通过 name 属性指定。