我正在使用请求和beautifulsoup搞乱网页抓取,当我尝试通过在每个循环中添加1个页码来遍历多页留言板数据时,我得到了一些奇怪的结果。
以下代码是我在消息板上然后第2页循环浏览第1页的示例。只是为了检查自己,我正在打印我正在点击的URL,然后是该页面上找到的第一条记录。 URL看起来是正确的,但第一篇文章对于两者都是相同的。但是如果我复制并粘贴这两个网址,我肯定会在网页上看到一组不同的内容。
有人能告诉我这是否是我的代码存在问题,或者是否与该论坛上的数据结构有关,而这些数据是给我这些结果的?提前谢谢!
from bs4 import BeautifulSoup
import requests
n_pages = 2
base_link = 'http://tigerboard.com/boards/list.php?board=4&page='
for i in range (1,n_pages+1):
link = base_link+str(i)
html_doc = requests.get(link)
soup = BeautifulSoup(html_doc.text,"lxml")
bs_tags = soup.find_all("div",{"class":"msgline"})
posts=[]
for post in bs_tags:
posts.append(post.text)
print link
print posts[0]
> http://tigerboard.com/boards/list.php?board=4&page=1
> 52% of all websites are in English, but - catbirdseat MU - 3/23/17 14:41:06
> http://tigerboard.com/boards/list.php?board=4&page=2
> 52% of all websites are in English, but - catbirdseat MU - 3/23/17 14:41:06
答案 0 :(得分:3)
该网站的实施是虚假的。出于某种原因,它需要设置特定的Cookie PHPSESSID
,否则它将不会返回除第一页之外的其他页面,而不管page
参数。
设置此Cookie可解决问题:
from bs4 import BeautifulSoup
import requests
n_pages = 2
base_link = 'http://tigerboard.com/boards/list.php?board=4&page='
for i in range (1,n_pages+1):
link = base_link+str(i)
html_doc = requests.get(link, headers={'Cookie': 'PHPSESSID=notimportant'})
soup = BeautifulSoup(html_doc.text,"lxml")
bs_tags = soup.find_all("div",{"class":"msgline"})
posts=[]
for post in bs_tags:
posts.append(post.text)
print link
print posts[0]
另一种解决方案是使用session,因为(第一页的第一个请求)会将cookie设置为实际值,并且会在以后的请求中发送。
调试很有趣!