Scrapy编写的eBay爬虫爬取5页后停止的问题求助
问题原因
你的爬虫爬满5页就停止,是代码bug加平台访问限制共同导致的:
- Item实例初始化位置错误:你把
EbaySold()的实例写在了商品循环外部,循环过程中反复修改同一个对象的属性,不仅会导致导出数据重复错乱,还容易因空值触发异常中断请求调度 - 下一页逻辑存在硬伤:
a[type=next]选择器无法匹配eBay实际的下一页按钮,且直接调用.attrib['href']在匹配不到元素时会直接抛出异常,不会走到你写的if next_page is not None判断分支 - 反爬触发+平台访客限制:Scrapy默认请求头不带真实浏览器标识、请求间隔过短会触发eBay反爬,返回验证码/空页面;同时eBay对未登录访客仅展示已售商品列表的前5页内容,超过5页会强制跳转验证,自然拿不到后续分页链接
修复方案
代码逻辑修正
- 把Item实例的初始化移到商品遍历循环内部,每个商品单独生成独立Item对象,避免数据污染
- 修正下一页按钮的CSS选择器,先判断元素存在再提取链接,不要直接硬取属性触发报错
- 给所有字段提取增加非空判断,避免页面局部结构变动时空值调用方法抛异常
- 增加基础反爬配置,设置合理的请求延迟、真实浏览器UA,降低被拦截概率
修复后完整代码
import scrapy from myproject.items import EbaySold class EbaySpider(scrapy.Spider): name = 'EbaySold' allowed_domains = ['www.ebay.com'] # 基础反爬配置 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'DOWNLOAD_DELAY': 2.5, 'CONCURRENT_REQUESTS': 1 } start_urls = ['https://www.ebay.com/b/Apple-Unlocked-Smartphones/9355/bn_599372?LH_Sold=1&mag=1&rt=nc&_dmd=1&_pgn=1&_sop=13'] def parse(self, response): products = response.css('li.s-item') for product in products: product_item = EbaySold() product_item['name'] = product.css('h3.s-item__title::text').get() if not product_item['name']: product_item['name'] = product.css('span.BOLD::text').get() product_item['sold_price'] = product.css('span.POSITIVE::text').get() date_tag = product.css('div.s-item__title-tag::text').get() if date_tag: product_item['date_sold'] = date_tag.replace('SOLD ', '') yield product_item # 修正后的下一页提取逻辑 next_page = response.css('a.pagination__next::attr(href)').get() if next_page: yield response.follow(next_page, callback=self.parse)
注意事项
- 未携带有效登录Cookie的情况下,eBay最多只给访客展示前5页已售商品数据,这是平台侧的访问限制,不是代码问题。如果需要爬取20页内容,需要在请求中加入你自己eBay账号登录后的有效Cookie
- 不要随意调低请求延迟,否则会被平台临时封禁IP,返回403或验证码页面导致爬虫中断
- 爬取eBay数据请遵守平台robots协议及相关使用条款
内容的提问来源于stack exchange,提问作者p51moustache
相关产品推荐
相关产品推荐

