【问题标题】:Web scraping with BeautifulSoup only scrapes the first page使用 BeautifulSoup 抓取网页只抓取第一页
【发布时间】:2020-03-27 07:57:40
【问题描述】:

我正在尝试从 webmd 留言板抓取一些数据。最初,我构建了一个循环来获取每个类别的页码并将其存储在数据框中。当我尝试运行循环时,我确实为每个子类别获得了适当数量的帖子,但仅限于第一页。有什么想法可能出了什么问题?

lists2=[]
df1= pd.DataFrame (columns=['page'],data=page_links)
for j in range(len(df1)):
   pages = (df1.page.iloc[j])
   print(pages)
   req1 = urllib.request.Request(pages, headers=headers)
   resp1 = urllib.request.urlopen(req1)
   soup1 = bs.BeautifulSoup(resp1,'lxml')
   for body_links in soup1.find_all('div',class_="thread-detail"):
       body= body_links.a.get('href')
       lists2.append(body)

我在打印功能中获得了正确的页面,但它似乎只在第一页进行迭代并获取帖子的链接。此外,当我复制并粘贴除第一个页面之外的任何页面的链接时,它似乎会暂时加载第一页,然后转到正确的编号页面。我尝试添加 time.sleep(1) 但不起作用。我尝试的另一件事是添加{headers='Cookie': 'PHPSESSID=notimportant'}

【问题讨论】:

  • 您需要创建某种能够识别分页链接的递归函数 - I've only ever done this with pyquery
  • 使用requests,您可以使用Session,当您第一次执行GET 请求时,它将从服务器获取PHPSESSID(和其他cookie),并将其添加到所有其他@987654329 @/POST 自动请求。
  • 你为什么不使用for url in page_links:。为此,您不需要DataFrame。如果你需要DataFrame 那么for url in df1['page']:
  • @furas 我将如何实现这个?
  • 对我来说,你的问题不在DataFrame,而是在find_all - 似乎只有一页在HTML中有<div class_="thread-detail">,所以它无法从其他页面获取元素。

标签: python web-scraping beautifulsoup


【解决方案1】:

替换这一行:

pages = (df1.page.iloc[j])

有了这个:

pages = (df1.page.iloc[j, 0])

您现在将遍历 DataFrame 的值

【讨论】:

  • 遍历数据框似乎不是问题。这也会返回错误。
【解决方案2】:

如果page_links 是带有类似网址的列表

page_links = ["http://...", "http://...", "http://...", ]

那么你可以直接使用它

for url in page_links:
    req1 = urllib.request.Request(url headers=headers)

如果你在DataFrame中需要它,那么

for url in df1['page']:
    req1 = urllib.request.Request(url headers=headers)

但是,如果您当前的代码显示所有 url,但您只获得一页的结果,那么问题不在 DataFrame 而是在 HTMLfind_all

似乎只有第一页有<div class_="thread-detail">,所以在其他页面上找不到它,也无法将其添加到列表中。你应该再检查一遍。对于其他页面,您可能需要 find_all 中的不同参数。但是如果没有这些页面的 url,我们就无法检查它,我们也无能为力。

这可能是其他常见问题 - 页面可能使用 JavaScript 添加这些元素,但 BeautifulSoup 无法在 Chrome/Firefox 中运行 JavaScript - and then you woould need [Selenium](https://selenium-python.readthedocs.io/) to control web browser which can run JavaScript. You could turn off JavaScript in browser and open urls to check if you can see elements on page and in HTML inDevTools`。


对于PHPSESSIDrequests,您可以使用Session 从服务器获取带有PHPSESSID 的新鲜cookie,并自动将它们添加到其他请求中

import requests

s = reqeusts.Session()

# get any page to get fresh cookies from server
r = s.get('http://your-domain/main-page.html')

# use it automatically with cookies
for url in page_links:
    r = s.get(url)

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多