使用BS4遍历页面列表时仅提取到每个页面最后一个链接的异常问题
爬虫仅提取每个页面最后一个链接的问题排查与解决
我尝试爬取一个包含12个页面的网站,每个页面里有若干文章链接,目标是提取所有链接存储起来后续使用。但现在遇到了问题:每个页面只提取到最后一个链接,预期应该有大概80个链接,但实际结果远达不到。以下是我的实现代码:
import requests from bs4 import BeautifulSoup import pandas as pd import csv import time # 生成页面URL并存储到issues列表 archive = '[redacted URL]' issues =[] # 遍历生成第163至175期的页面URL for i in range(163,175): url_of_issue = archive + '/' + str(i) issues.append(url_of_issue) # 从生成的页面中提取论文链接并存储到paper_urls列表 paper_urls =[] for url in issues: response = requests.get(url) html = response.text soup = BeautifulSoup(html, "html.parser") for a in soup.select('.obj_article_summary .title a'): ahrefTags=(a['href']) paper_urls.append(ahrefTags) print(paper_urls) time.sleep(5)
问题分析与解决办法
我们一步步排查可能的原因,对应给出解决方向:
1. 先验证CSS选择器是否匹配所有目标链接
你当前用的选择器.obj_article_summary .title a可能没覆盖到所有文章链接。建议打开任意一个目标页面,按F12打开浏览器开发者工具,在控制台输入这段代码:
document.querySelectorAll('.obj_article_summary .title a')
查看返回的NodeList长度,如果长度是1,说明选择器只命中了单个元素,需要重新调整选择器——比如页面中文章的容器类名可能不是obj_article_summary,或者标题的层级结构有差异,得重新定位正确的元素路径。
2. 检查请求是否返回了完整的页面内容
有些网站会拦截非浏览器的请求,导致requests.get()拿到的HTML不完整。你可以在请求后加一些调试代码:
response = requests.get(url) print(f"请求URL: {url},状态码: {response.status_code}") # 打印前500字符,确认是否包含文章列表内容 print(response.text[:500])
如果状态码不是200,或者响应内容里找不到文章相关的结构,建议添加请求头模拟浏览器:
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' } response = requests.get(url, headers=headers)
3. 考虑页面是否为动态加载内容
如果目标页面的文章列表是通过JavaScript异步渲染的,requests只能拿到初始的静态HTML,获取不到动态加载的内容。这种情况需要用Selenium或Playwright这类工具模拟浏览器渲染:
以Selenium为例,修改后的代码如下:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC archive = '[redacted URL]' issues =[] for i in range(163,175): url_of_issue = archive + '/' + str(i) issues.append(url_of_issue) paper_urls = [] # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() for url in issues: driver.get(url) # 等待所有文章链接加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.obj_article_summary .title a')) ) # 提取所有链接 links = driver.find_elements(By.CSS_SELECTOR, '.obj_article_summary .title a') for link in links: href = link.get_attribute('href') if href: # 确保链接不为空 paper_urls.append(href) print(paper_urls) time.sleep(5) driver.quit()
内容的提问来源于stack exchange,提问作者drupaljac
相关产品推荐
相关产品推荐

