Python网络爬虫进阶:Scrapy高级用法与技巧

Scrapy是一个用于Python的快速、高级别的网络爬虫框架,它允许你以快速、简单和可维护的方式抓取网页。Scrapy设计用于抓取大量数据,并且内置了许多功能,如异步网络请求、HTML内容解析、数据持久化等。

下面是一些Scrapy的高级用法和技巧,以及相应的代码示例:

1. 使用Scrapy Shell进行交互式调试

Scrapy Shell是一个内置的交互式调试工具,它可以让你快速测试XPath和CSS选择器。

复制代码
scrapy shell 'http://example.com'

进入Scrapy Shell后,你可以使用fetch()方法获取页面内容,并使用view(response)在浏览器中查看。

复制代码
fetch('http://example.com')  
view(response)

2. 自定义请求和响应处理

你可以通过编写Spider的parse方法以及其他回调函数来处理请求和响应。

复制代码
import scrapy  
  
class MySpider(scrapy.Spider):  
    name = 'myspider'  
    start_urls = ['http://example.com']  
  
    def parse(self, response):  
        # 提取数据  
        self.log('Visited %s' % response.url)  
        for href in response.css('a::attr(href)').getall():  
            # 创建新的请求  
            yield scrapy.Request(response.urljoin(href), self.parse_page)  
  
    def parse_page(self, response):  
        # 处理页面数据  
        self.log('Visited %s' % response.url)  
        title = response.css('h1::text').get()  
        if title:  
            # 存储数据  
            yield {'title': title}

3. 使用Item Loaders简化数据提取

Item Loaders提供了一种简单的方法来收集爬取的数据,并且支持多种输入方式,如CSS选择器、XPath等。

复制代码
from scrapy.loader import ItemLoader  
from myproject.items import MyItem  
  
class MySpider(scrapy.Spider):  
    # ...  
  
    def parse_page(self, response):  
        l = ItemLoader(item=MyItem(), response=response)  
        l.add_css('name', 'span.name::text')  
        l.add_xpath('price', '//price/text()')  
        return l.load_item()

4. 使用Middlewares处理请求和响应

Middlewares允许你在请求被发送或响应被处理之前执行自定义逻辑。

复制代码
class MyCustomMiddleware:  
  
    def process_request(self, request, spider):  
        # 在请求被发送之前做些什么  
        pass  
  
    def process_response(self, request, response, spider):  
        # 在响应被处理之前做些什么  
        return response  
  
# 在Scrapy项目的settings.py中启用middleware  
DOWNLOADER_MIDDLEWARES = {  
   'myproject.middlewares.MyCustomMiddleware': 543,  
}

5. 使用Extensions和Pipelines持久化数据

Extensions和Pipelines允许你实现数据的持久化,如存储到数据库或文件。

复制代码
class MyPipeline:  
  
    def open_spider(self, spider):  
        self.file = open('items.jl', 'w')  
  
    def close_spider(self, spider):  
        self.file.close()  
  
    def process_item(self, item, spider):  
        line = json.dumps(dict(item)) + "\n"  
        self.file.write(line)  
        return item  
  
# 在Scrapy项目的settings.py中启用pipeline  
ITEM_PIPELINES = {  
   'myproject.pipelines.MyPipeline': 300,  
}

CrawlSpiders允许你使用规则来提取链接并跟进,非常适合爬取大型网站。

复制代码
from scrapy.linkextractors import LinkExtractor  
from scrapy.spiders import CrawlSpider, Rule  
  
class MySpider(CrawlSpider):  
    name = 'myspider'  
    allowed_domains = ['example.com']  
    start_urls = ['http://example.com/']  
  
    rules = (  
        Rule(LinkExtractor(allow=r'Category/\d+'), callback='parse_category_page', follow=True),  
        Rule(LinkExtractor(allow=r'Product/\d+'), callback='parse_product_page'),  
    )  
  
    def parse_
相关推荐
又是忙碌的一天13 分钟前
java字符串
java·开发语言
Hi2024021714 分钟前
Qt+Qml客户端和Python服务端的网络通信原型
开发语言·python·qt·ui·网络通信·qml
chxii16 分钟前
ISO 8601日期时间标准及其在JavaScript、SQLite与MySQL中的应用解析
开发语言·javascript·数据库
Teable任意门互动25 分钟前
主流多维表格产品深度解析:飞书、Teable、简道云、明道云、WPS
开发语言·网络·开源·钉钉·飞书·开源软件·wps
程序员大雄学编程1 小时前
「用Python来学微积分」16. 导数问题举例
开发语言·python·数学·微积分
-Excalibur-1 小时前
形象解释关于TCP/IP模型——层层封装MAC数据帧的过程
linux·c语言·网络·笔记·单片机·网络协议·tcp/ip
B站_计算机毕业设计之家1 小时前
预测算法:股票数据分析预测系统 股票预测 股价预测 Arima预测算法(时间序列预测算法) Flask 框架 大数据(源码)✅
python·算法·机器学习·数据分析·flask·股票·预测
Dreams_l2 小时前
redis中的数据类型
java·开发语言
梵得儿SHI2 小时前
Java IO 流详解:字符流(Reader/Writer)与字符编码那些事
java·开发语言·字符编码·工作原理·字符流·处理文本