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框架实现翻页功能
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)
代码解释:
- 数据解析:在
parse方法里,先用response.css提取当前页面的主要数据(比如div.book-item里的每本书信息),并yield这些数据项。 - 翻页逻辑:这是重点。用
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-splash或scrapy-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
这个页面你多少页都有内容啊,因为都是最后一页内容
我那个写的有问题吗?

