通过使用Python抓取多个URL来循环,但是当我遍历网站页码时数据不会改变?

时间:2017-03-23 19:56:36

标签: python beautifulsoup python-requests

我正在使用请求和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

1 个答案:

答案 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设置为实际值,并且会在以后的请求中发送。

调试很有趣!