python - Scrapy蜘蛛不会跳转到下一页
问题描述
我正在为瑞典电子商务网站 Blocket.se 构建一个带有 Scrapy 的 scaper。它正在按应有的方式抓取第一页,但不会跳到下一页。
下一个 url 的命令
response.xpath(u'//a[contains(text(), "Nästa")]/@href').extract()
当我在 Scrapy shell 中尝试时输出一个“不完整”的链接:
?q=cykel&cg=0&w=1&st=s&c=&ca=11&l=0&md=th&o=2
它必须是“完整”链接才能工作吗?:
https://www.blocket.se/stockholm?q=cykel&cg=0&w=1&st=s&c=&ca=11&l=0&md=th&o=2
起始网址:https ://www.blocket.se/stockholm?q=cykel&cg=0&w=1&st=s&c=&ca=11&is=1&l=0&md=th
完整代码:
import scrapy
class BlocketSpider(scrapy.Spider):
name = "blocket"
start_urls = ["https://www.blocket.se/stockholm?q=cykel&cg=0&w=1&st=s&c=&ca=11&is=1&l=0&md=th"]
def parse(self, response):
urls = response.css("h1.media-heading > a::attr(href)").extract()
for url in urls:
url = response.urljoin(url)
yield scrapy.Request(url=url, callback=self.parse_details)
#follow pagination links
next_page_url = response.xpath(u'//a[contains(text(), "Nästa")]/@href').extract()
if next_page_url:
next_page_url = response.urljoin(next_page_url)
yield scrapy.Request(url=next_page_url, callback=self.parse)
def parse_details(self, response):
yield {
"Objekt": response.css("h1.h3::text").extract(),
"Säljare":response.css("li.mrl > strong > a::text").extract(),
"Uppladdad": response.css("li.mrl > time::text").extract(),
"Pris": response.css("div.h3::text").extract(),
"Område": response.css("span.area_label::text").extract(),
"Bild-URL": response.css("div.item > img::attr(src)").extract(),
}
解决方案
是的,scrapy 通常需要完整的 URL。但是您可以继续使用urljoin()
或使用该response.follow()
方法:
next_page_url = response.xpath(u'//a[contains(text(), "Nästa")]/@href').extract()
if next_page_url:
yield response.follow(url=next_page_url, callback=self.parse)
更多关于这个在Scrapy 教程中。
推荐阅读
- python - wxpython:只要第二帧打开就暂停代码
- plotly-dash - DASH plotly bootstrap 在打印时隐藏 div
- ruby-on-rails - 基于多租户 Rails 应用程序不会使用 gemacts_as_tenant 区分域
- html - 网格系统的引导问题
- kdb - 如何获取 kdb 数据库中每一列的长度?
- go - Go 上下文:存储 WithCancel(ctx) 返回的 cancel() 函数
- java - Spring Boot App 无法识别 application.yml 文件中的环境变量
- javascript - javascript Array.push({y: yValue, label: myLabel}) 设置随机“x”键值
- vue.js - Vuetify 如何更改面包屑中分隔线的填充
- json - 如何从 json 输出中读取值