Python中如何使用Scrapy框架实现翻页功能

def get_page_content(self,response):
next_page = response.xpath(’//div[@class=“page”]/a[contains(@ka,“page-next”)]/@href’).extract()
print(response.url)
linkList=response.xpath(’//div[@class=“sub-li”]/a[contains(@class,“company-info”)]/@href’).extract()
linkList=[response.urljoin(link) for link in linkList]
if linkList :
for link in linkList:
yield scrapy.Request(url=link,callback=self.final_parsre,dont_filter=True)

next_page = response.xpath(’//div[@class=“page”]/a[contains(@ka,“page-next”)]/@href’).extract()
print(next_page)
if next_page is not None:
next_page=response.urljoin(next_page[0])
yield scrapy.Request(url=next_page,callback=self.get_page_content,dont_filter=True)

https://www.zhipin.com/gongsi/_zzz_c101200100_iy100101_t801_s302/?page=1&ka=page-1

这个网站翻页是通过点击 next page 不知道有多少页,因为我要点很多按钮 城市 融资,然后点入每个详情页 抓数据,现在不知道多少页,只能通过点击下一页找,如何写?
Python中如何使用Scrapy框架实现翻页功能


14 回复

if len(next_page) != 0: yield xxxx ???


在Scrapy里实现翻页功能,主要就是处理下一页链接的提取和跟进。核心思路是在parse方法里找到下一页的链接,然后生成一个新的Request对象去请求它。下面是一个典型的例子,假设我们要爬取一个图书列表网站,它的翻页按钮链接在a.next-page这个CSS选择器里。

import scrapy

class BookSpider(scrapy.Spider):
    name = 'book_spider'
    start_urls = ['http://example.com/books?page=1']

    def parse(self, response):
        # 1. 首先解析当前页面的数据(比如图书列表)
        books = response.css('div.book-item')
        for book in books:
            # 这里提取每本书的详细信息,比如书名、价格
            item = {
                'title': book.css('h2::text').get(),
                'price': book.css('.price::text').get()
            }
            yield item

        # 2. 关键部分:找到并跟进“下一页”链接
        next_page = response.css('a.next-page::attr(href)').get()
        if next_page is not None:
            # 构建绝对URL(如果next_page是相对路径)
            next_page_url = response.urljoin(next_page)
            # 创建一个新的Request对象,回调函数仍然是parse,这样就能递归地处理所有页面
            yield scrapy.Request(next_page_url, callback=self.parse)

代码解释:

  1. 数据解析:在parse方法里,先用response.css提取当前页面的主要数据(比如div.book-item里的每本书信息),并yield这些数据项。
  2. 翻页逻辑:这是重点。用response.css('a.next-page::attr(href)').get()尝试获取“下一页”链接的href属性。
    • 如果找到了(next_page is not None),就用response.urljoin(next_page)把它拼成一个完整的URL。这一步很重要,因为网页上的链接经常是相对路径(比如/books?page=2)。
    • 然后,yield scrapy.Request(next_page_url, callback=self.parse)。这行代码会调度一个新的请求去抓取下一页,并且指定回调函数还是parse自己。这样,Scrapy就会自动一页一页地抓下去,直到没有下一页链接为止。

几个实用技巧:

  • 分页URL规律明显:如果页码直接体现在URL里(比如?page=2),你也可以直接用字符串格式化或urljoin来构造下一页URL,不一定非要从页面里提取。这样更稳定,尤其是当网站没有明确的“下一页”按钮时。
    # 假设你知道总页数,或者想爬固定页数
    for page in range(2, 11): # 从第2页爬到第10页
        next_url = f'http://example.com/books?page={page}'
        yield scrapy.Request(next_url, callback=self.parse)
    
  • 处理JavaScript加载:如果“下一页”按钮是通过JavaScript动态加载的(在初始HTML里看不到),简单的CSS选择器就抓不到了。这时候你可能需要用scrapy-splashscrapy-playwright这样的中间件来渲染JavaScript。

总结:核心就是找到下一页链接并递归调用parse方法。

用 class="next"貌似要好些,因为没有下一页就没这个标签了

https://www.zhipin.com/gongsi/_zzz_c101200100_iy100101_t801_s302/

这个网站我先进入每个详情页,然后再翻页 进入详情页抓数据

这个不好处理

try: 获取下一页;yeild 下一页; except: pass

递归下一页。
获取的数据返回在顶层打包丢给 pipeline

为啥 try

我爬过拉钩的,类似也是分页的,我记得我是 page += 1,
if item:
break
else:
items.append(item)

//item 是职位信息

scripy-redis 这个框架里面有一个自动去重的,可以用这个框架抓取

因为下页的 url 在最后一页肯定是获取不到或得到 None 的。yield 下一页的 Request 对象就会报错。scrapy 本身也有异常处理机制并不会影响其它 Request 对象执行,只是输出错误信息到日志里面。

直接使用捕获异常,或是先检测再使用是两种哲学。
python 和一些动态语言倾向使用第一种哲学

方法挺多,1.先爬列表页所有,判断有没有内容了,if not room_list :return,
2.然后解析详情页。
ls 那种方法去重也行,或者 CrawlSpider

这个页面你多少页都有内容啊,因为都是最后一页内容

我那个写的有问题吗?

回到顶部