Python3.6只返回第一页时的抓取问题

2024-09-23 06:31:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python从公共站点获取数据。在该网站上有不同类型的搜索。有一种按字母排列的搜索类型。当我用字母“A”搜索它时,它会向页面发送一个GET请求,该页面从下面的url返回响应

http://www.museumsusa.org/museums/?k=1271393%2cAlpha%3aA%3bDirectoryID%3a200454

但它会显示第一页。我在第一页上得到了所有的数据。但是当我点击第二页时。它发送一个get请求,该请求由JavaScript的_postback函数发送到用于get请求的相同url,但参数不同

data={
'__EVENTTARGET':"ctl08$ctl00$BottomPager$Page2",
'__EVENTARGUMENT':"",
'__VIEWSTATE':VIEWSTATE,
'__EVENTVALIDATION':EVENTVALIDATION,
'ctl04$phrase':"",
'ctl04$directoryList':"/museums/|/museums/search/"

__EVENTTARGET中,它发送一个页面名。我已成功获得VIEWSTATE值和EVENTVALIDATION。但无论何时发送帖子请求,我总是得到第一页。这是我的完整代码

import requests
import json
from bs4 import BeautifulSoup
import urllib



url="http://www.museumsusa.org/museums/?k=1271393%2cAlpha%3aA%3bDirectoryID%3a200454";
headers={
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) "
                 "Chrome/60.0.3112.101 Safari/537.36",
    "Content-Type":"application/x-www-form-urlencoded"}

session = requests.Session()
session.headers.update(headers)
r=session.get(url)
soup=BeautifulSoup(r.content)
#?k=1271393%2cAlpha%3aA%3bDirectoryID%3a200454
VIEWSTATE=soup.find(id="__VIEWSTATE")['value']
#VIEWSTATEGENERATOR=soup.find(id="__VIEWSTATEGENERATOR")['value']
EVENTVALIDATION=soup.find(id="__EVENTVALIDATION")['value']


data_in={
'__EVENTTARGET':"ctl08$ctl00$BottomPager$Page2",
'__EVENTARGUMENT':"",
'__VIEWSTATE':VIEWSTATE,
'__EVENTVALIDATION':EVENTVALIDATION,
'ctl04$phrase':"",
'ctl04$directoryList':"/museums/|/museums/search/"
#"k":"1271393,Alpha:A;DirectoryID:200454"
      }


r2 = session.post(url, data=json.dumps(data_in))

print (r2)

如何从不同的页面获取数据,因为此脚本总是返回第一页的数据。无论你尝试什么数字。我正在使用 MacOSX上的Python 3.6


Tags: importurldatagetsessionwww页面find
1条回答
网友
1楼 · 发布于 2024-09-23 06:31:51

如果将data_in['__EVENTTARGET']的值更改为"ctl08$ctl00$BottomPager$Next",则可以转到下一页。然后使用for循环获得特定数量的页面,例如10

url = "http://www.museumsusa.org/museums/?k=1271393%2cAlpha%3aA%3bDirectoryID%3a200454"
headers={
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko)"
}
session = requests.Session()
session.headers.update(headers)
r=session.get(url)
pages = 10

for _ in range(pages):
    soup=BeautifulSoup(r.content, 'html.parser')
    VIEWSTATE=soup.find(id="__VIEWSTATE")['value']
    EVENTVALIDATION=soup.find(id="__EVENTVALIDATION")['value']
    data_in={
        '__EVENTTARGET':'ctl08$ctl00$BottomPager$Next',
        '__EVENTARGUMENT':"",
        '__VIEWSTATE':VIEWSTATE,
        '__EVENTVALIDATION':EVENTVALIDATION,
        'ctl04$phrase':"",
        'ctl04$directoryList':"/museums/|/museums/search/"
    }
    r = session.post(url, data=data_in)

相关问题 更多 >