我正在尝试从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'}
答案 0 :(得分:1)
替换此行:
pages = (df1.page.iloc[j])
与此:
pages = (df1.page.iloc[j, 0])
您现在将遍历DataFrame的值
答案 1 :(得分:0)
如果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
中,而在HTML
和find_all
中。
似乎只有第一页有<div class_="thread-detail">
,因此在其他页面上找不到它,也无法将其添加到列表中。您应该再次检查。对于其他页面,您可能在find_all
中需要不同的参数。但是,如果没有这些页面的网址,我们将无法对其进行检查,也无法提供更多帮助。
可能是另一个常见问题-页面可能使用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 in
DevTools`。
对于带有PHPSESSID
的{{1}},您可以使用requests
从带有Session
的服务器中获取新鲜的cookie并将其自动添加到其他请求中
PHPSESSID