scrapy爬取动态分页内容

本文介绍了一种结合Scrapy和Selenium技术的动态分页爬虫方案,用于爬取通过JavaScript动态加载内容的网站。文章详细阐述了技术难点及解决方案,并提供了具体的Spider代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、任务定义:

爬取某动态分页页面中所有子话题的内容。

所谓“动态分页”:是指通过javascript(简称“js”)点击实现翻页,很多时候翻页后的页面地址url并没有变化,而页面内容随翻页动作动态变化。

 

2、任务难点及处理方法:

难点:

1)  scrapy如何动态加载所有“下一页”:要知道scrapy本身是不支持js操作的。

2)  如何确保页面内容加载完成后再进行爬取:由于内容是通过js加载的,如果不加控制,很可能出现爬到空页面的情况。

处理方法:

1)scrapy+selenium模拟浏览器点击:通过模拟浏览器点击的方式进行翻页,从而获取每一页内部的有效链接。

2)使用WebDriverWait()等待数据加载:即确保对应内容加载完成后,再进行相应爬取任务。

 

3、基本思路:

1)  通过模拟浏览器翻页(涉及模拟点击翻页问题),获取每个分页中待爬取页面的url(涉及数据加载问题),将url列表存入文件;

2)  针对每一个url进行普通的爬取。

 

4、待爬取页面分析:

举例:爬取某网站中所有子话题的内容。

1)子话题都在ul[@class="post-list"]标签下,xpath可以写成li[@class],表示所有具备class属性的li标签。


2)要想爬取所有页面,需要浏览器模拟点击右上角的“下一页”标签(<li>)。具体分析页面代码后发现,最后一页的“下一页”标签不可点击,可以作为停止获取url列表的标志。

最后一页的“下一页”标签:<liclass="pg_next pg_empty"data-reactid="XX"></li>

其余的“下一页”标签:<liclass="pg_next"data-reactid="XX"></li>

next_page = response.xpath('//ul[@class="pg1"]/li[@class="pg_next"]')

 

5、Spider代码:

# -*- coding: utf-8 -*-
import scrapy
import time
import base64
from selenium import webdriver
from selenium.webdriver.support.ui importWebDriverWait
from buluo.items import BuluoItem
 
class buluoSpider(scrapy.Spider):   
   name = 'buluo_spider'
   def __init__(self, bid = None): #示例:bid = 12339
       """初始化起始页面和游戏bid
       """
       super(buluoSpider, self).__init__()
       self.bid = bid #参数bid由此传入
       self.start_urls = ['http://buluo.qq.com/p/barindex.html?bid=%s' % bid]
       self.allowed_domain = 'buluo.qq.com'
       self.driver = webdriver.Firefox()       
       self.driver.set_page_load_timeout(5) #throw a TimeoutException when thepage load time is more than 5 seconds.
       
   def parse(self, response):
       """模拟浏览器实现翻页,并解析每一个话题列表页的url_list
       """       
       url_set = set() #话题url的集合
       self.driver.get(response.url)
       while True:                        
           wait = WebDriverWait(self.driver, 2)
           wait.until(lambda driver:driver.find_element_by_xpath('//ul[@class="post-list"]/li[@class]/a'))#VIP,内容加载完成后爬取
           sel_list = self.driver.find_elements_by_xpath('//ul[@class="post-list"]/li[@class]/a')
           url_list = [sel.get_attribute("href") for sel in sel_list]
           url_set |= set(url_list)
           try:
                wait =WebDriverWait(self.driver, 2)
                wait.until(lambda driver:driver.find_element_by_xpath('//ul[@class="pg1"]/li[@class="pg_next"]'))#VIP,内容加载完成后爬取
                next_page =self.driver.find_element_by_xpath('//ul[@class="pg1"]/li[@class="pg_next"]')
                next_page.click() #模拟点击下一页
           except:
                print "#####Arrive thelast page.#####"
                break            
       with open('url_set.txt', mode='w') as f:
           f.write(repr(url_set))
       for url in url_set:           
           yield scrapy.Request(url, callback=self.parse_content)
   
   def parse_content(self, response):
       """提取话题页面内容,通过pipeline存入指定字段
       """
       item = BuluoItem()
       item['timestamp'] = time.strftime('%Y-%m-%d %H:%M:%S')
       item['bid'] = self.bid
       item['url'] = response.url
       #item['content'] = response.body.decode('utf-8')
       item['content'] = base64.b64encode(response.body) #编码为Base64的网页内容
       yield item
 

6、爬虫运行:

其余还需配置好settings.py、items.py和pipeline.py等文件,cmd中运行如下命令,即可根据游戏编号爬取想要的子话题内容:

scrapy crawl buluo_spider -a bid=12339


<think>好的,用户想了解如何使用Scrapy进行网页爬取。首先,我需要回忆一下Scrapy的基本架构和工作流程。Scrapy是一个强大的Python框架,专门用于高效地爬取网页并提取结构化数据。根据用户提供的引用内容,特别是引用[2]中提到Scrapy提供了多种爬虫基类,并且可以方便地修改,这应该是回答的重点。 接下来,我应该分步骤解释如何创建Scrapy项目,定义Item类,编写爬虫,以及处理数据。需要确保用户理解每个步骤的作用,比如生成项目结构、定义要抓取的数据字段、使用Spider类编写爬取逻辑,以及通过Item Pipeline处理数据存储。 用户可能对动态网页爬取有疑问,但根据问题,主要关注的是基本爬取流程。不过引用[1]提到使用Scrapy-Splash处理动态内容,这可能是一个相关的高级话题,可以在相关问题中提及。 另外,用户提供的引用[3]涉及递归爬取,即如何处理分页或深层链接。这也是实现完整爬虫的重要部分,需要在步骤中说明如何通过回调函数或跟进链接来实现。 需要注意使用正确的中文术语,比如“爬虫”而不是“蜘蛛”,同时确保代码示例符合Scrapy的最新版本语法,例如使用start_requests方法和yield语句生成请求。还要提醒用户运行爬虫的命令,如scrapy crawl,如引用[1]中的示例。 最后,生成的相关问题需要覆盖用户可能进一步探索的方向,比如处理动态内容、数据存储优化、递归爬取策略以及遵守Robots协议等。这些扩展问题可以帮助用户深入理解Scrapy的不同方面。</think>### 如何用Scrapy实现网页爬取 #### 1. 创建Scrapy项目 通过命令行初始化项目结构: ```bash scrapy startproject myproject cd myproject ``` 生成的文件包含`items.py`(数据模型)、`middlewares.py`(中间件)、`pipelines.py`(数据处理)和`settings.py`(配置)[^2]。 #### 2. 定义数据模型 在`items.py`中声明要抓取的字段: ```python import scrapy class ArticleItem(scrapy.Item): title = scrapy.Field() content = scrapy.Field() url = scrapy.Field() ``` #### 3. 编写爬虫逻辑 在`spiders/`目录下新建爬虫文件(如`article_spider.py`): ```python import scrapy from myproject.items import ArticleItem class ArticleSpider(scrapy.Spider): name = "news_crawler" start_urls = ["https://example.com/news"] def parse(self, response): # 提取文章列表 for article in response.css("div.article-list"): item = ArticleItem() item["title"] = article.css("h2::text").get() item["url"] = article.css("a::attr(href)").get() # 跟进详情页 yield response.follow(item["url"], self.parse_detail, meta={"item": item}) def parse_detail(self, response): item = response.meta["item"] item["content"] = response.css("div.main-content::text").getall() yield item ``` #### 4. 配置参数优化 在`settings.py`中设置: ```python USER_AGENT = "Mozilla/5.0 (compatible; MyBot/1.0)" DOWNLOAD_DELAY = 2 # 降低请求频率 AUTOTHROTTLE_ENABLED = True # 自动限速 ITEM_PIPELINES = { "myproject.pipelines.JsonWriterPipeline": 300, } ``` #### 5. 数据存储处理 在`pipelines.py`中实现存储逻辑: ```python import json class JsonWriterPipeline: def open_spider(self, spider): self.file = open("articles.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 ``` #### 6. 执行爬虫 通过命令运行(支持多种输出格式): ```bash scrapy crawl news_crawler -o articles.csv ``` #### 关键组件说明 - **引擎(Engine)**: 控制数据流的核心系统 - **调度器(Scheduler)**: 管理请求队列 - **下载器(Downloader)**: 处理HTTP请求 - **爬虫(Spider)**: 自定义抓取规则 - **中间件(Middleware)**: 扩展请求/响应处理 - **管道(Pipeline)**: 数据清洗与持久化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值