Python requests.get获取Goodreads页面异常:始终返回第1页
Goodreads爬虫翻页失效问题解决
你的问题核心是Goodreads的反爬机制拦截了无标识请求,默认requests请求会带上python-requests/x.x.x的User-Agent,被网站识别为爬虫后,无论指定哪个page参数,都会强制返回第一页内容。另外你用了绝对路径的XPath,一旦页面结构微调就会失效,也需要优化。
解决步骤
- 添加请求头伪装浏览器:给所有
requests.get请求带上包含合法User-Agent的headers,让网站认为是正常浏览器访问 - 优化XPath选择器:放弃脆弱的绝对路径,改用基于class、属性的相对选择器,提升稳定性
- 规范资源管理:用
with语句处理文件和请求,避免资源泄漏
修改后的代码
import requests from lxml import html # 基础配置 root = "https://www.goodreads.com" # 替换成你自己浏览器的User-Agent,可通过F12开发者工具Network面板获取 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } save_path = "C:/Users/PCP/Desktop/images/" # 爬取第2到第3页(对应原代码pageno<4的逻辑) for pageno in range(2, 4): # 带headers请求书单页面 page = requests.get(f"{root}/shelf/show/fantasy?page={pageno}", headers=headers) tree = html.fromstring(page.content) # 用相对XPath提取所有书籍链接(替换原绝对路径) book_links = tree.xpath('//div[@class="elementList"]//a[@class="bookTitle"]/@href') imageno = 1 for link in book_links: try: # 请求书籍详情页,同样带headers book_page = requests.get(f"{root}{link}", headers=headers) book_tree = html.fromstring(book_page.content) # 提取封面图片链接 cover_url = book_tree.xpath('//img[@id="coverImage"]/@src')[0] # 下载封面,用with自动管理文件 cover_response = requests.get(cover_url, headers=headers) with open(f"{save_path}book{imageno}.jpg", "wb") as f: f.write(cover_response.content) imageno += 1 except Exception as e: print(f"处理书籍{link}出错: {str(e)}") continue
额外提示
- 不要频繁请求,建议添加
time.sleep(1)之类的延迟,避免触发更严格的反爬 - 如果还是被拦截,可以尝试使用
requests.Session()保持会话,模拟浏览器的Cookie持久化
内容的提问来源于stack exchange,提问作者Uri Gil
相关产品推荐
相关产品推荐

