【发布时间】:2017-08-19 17:42:58
【问题描述】:
我正在尝试使用 Python 从公共站点获取数据。在那个网站上有不同类型的搜索。有一种按字母搜索的类型。当我用字母“A”搜索它时,它会向页面发送一个 GET 请求,该页面从下面的 url 返回响应。
http://www.museumsusa.org/museums/?k=1271393%2cAlpha%3aA%3bDirectoryID%3a200454
但它显示第一页。我得到了第一页上的所有数据。但是当我点击第二页时。它通过 _postback 函数或 JavaScript 向用于 GET 请求但具有不同参数的相同 url 发送一个 get 请求。
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)
我如何从不同的页面获取数据,因为这个脚本总是返回第一页的数据。不管什么号码,如果尝试。我在用 Mac OSX 上的 Python 3.6
【问题讨论】:
标签: python macos python-3.x web-scraping python-requests