Đây là những gì tôi đang cố gắng làm: đi here, sau đó nhấn "tìm kiếm". Lấy dữ liệu, sau đó nhấn "tiếp theo" và tiếp tục nhấn tiếp theo cho đến khi bạn hết trang. Mọi thứ đều có thể chạm vào các tác phẩm "tiếp theo". Đây là mã của tôi. Định dạng của r.content hoàn toàn khác hai lần tôi in nó, cho biết có điều gì đó khác xảy ra giữa các yêu cầu GET và POST mặc dù tôi muốn có hành vi rất giống nhau. Tại sao điều này có thể xảy ra?Thực hiện yêu cầu POST tiếp theo trong phiên không hoạt động - web scraping
Điều tôi thấy lạ là ngay cả sau khi yêu cầu POST dường như trả lại nội dung sai, tôi vẫn có thể phân tích các url tôi cần - không phải trường nhập __EVENTVALIDATION.
Thông báo lỗi (kết thúc mã) cho biết nội dung không bao gồm dữ liệu này mà tôi cần để thực hiện yêu cầu tiếp theo, nhưng điều hướng đến trang cho thấy rằng nó có dữ liệu đó và định dạng rất giống với trang đầu tiên.
EDIT: Tôi đang mở trang web dựa trên HTML đó là phân tích cú pháp và điều gì đó chắc chắn không đúng. chạy mã bên dưới sẽ mở các trang đó.
Các GET được tôi một trang web với dữ liệu như thế này:
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="4424DBE6">
<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="">
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="TlIgNH
Trong khi POST tạo ra một trang web với tất cả các dữ liệu mà ở dưới cùng của trang trong bản rõ, như thế này:
|0|hiddenField|__EVENTTARGET||0|hiddenField|__EVENTARGUMENT||0|hiddenField|_
import requests
from lxml import html
from bs4 import BeautifulSoup
page = requests.get('http://search.cpsa.ca/physiciansearch')
print('got page!')
d = {"ctl00$ctl13": "ctl00$ctl13|ctl00$MainContent$physicianSearchView$btnSearch",
"ctl00$MainContent$physicianSearchView$txtLastName": "",
'ctl00$MainContent$physicianSearchView$txtFirstName': "",
'ctl00$MainContent$physicianSearchView$txtCity': "",
"__VIEWSTATEENCRYPTED":"",
'ctl00$MainContent$physicianSearchView$txtPostalCode': "",
'ctl00$MainContent$physicianSearchView$rblPractice': "",
'ctl00$MainContent$physicianSearchView$ddDiscipline': "",
'ctl00$MainContent$physicianSearchView$rblGender': "",
'ctl00$MainContent$physicianSearchView$txtPracticeInterests': "",
'ctl00$MainContent$physicianSearchView$ddApprovals': "",
'ctl00$MainContent$physicianSearchView$ddLanguage': "",
"__EVENTTARGET": "ctl00$MainContent$physicianSearchView$btnSearch",
"__EVENTARGUMENT": "",
'ctl00$MainContent$physicianSearchView$hfPrefetchUrl': "http://service.cpsa.ca/OnlineService/OnlineService.svc/Services/GetAlbertaCities?name=",
'ctl00$MainContent$physicianSearchView$hfRemoveUrl': "http://service.cpsa.ca/OnlineService/OnlineService.svc/Services/GetAlbertaCities?name=%QUERY",
'__ASYNCPOST': 'true'}
h ={ "X-MicrosoftAjax":"Delta = true",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"
}
urls = []
with requests.session() as s:
r = s.get("http://search.cpsa.ca/PhysicianSearch",headers=h)
soup = BeautifulSoup(r.content, "lxml")
tree = html.fromstring(r.content)
html.open_in_browser(tree)
ev = soup.select("#__EVENTVALIDATION")[0]["value"]
vs = soup.select("#__VIEWSTATE")[0]["value"]
vsg = soup.select("#__VIEWSTATEGENERATOR")[0]["value"]
d["__EVENTVALIDATION"] = ev
d["__VIEWSTATEGENERATOR"] = vsg
d["__VIEWSTATE"] = vs
r = s.post('http://search.cpsa.ca/PhysicianSearch', data=d,headers=h)
print('opening in browser')
retrievedUrls = tree.xpath('//*[@id="MainContent_physicianSearchView_gvResults"]/tr/td[2]/a/@href')
print(retrievedUrls)
for url in retrievedUrls:
urls.append(url)
endSearch = False
while endSearch == False:
tree = html.fromstring(r.content)
html.open_in_browser(tree)
soup = BeautifulSoup(r.content, "lxml")
print('soup2:')
## BREAKS HERE
ev = soup.select("#__EVENTVALIDATION")[0]["value"]
## BREAKS HERE,
vs = soup.select("#__VIEWSTATE")[0]["value"]
vsg = soup.select("#__VIEWSTATEGENERATOR")[0]["value"]
d["ctl00$ctl13"] = "ctl00$MainContent$physicianSearchView$ResultsPanel|ctl00$MainContent$physicianSearchView$gvResults$ctl01$btnNextPage"
d["__EVENTVALIDATION"] = ev
d["__EVENTTARGET"] = ""
d["__VIEWSTATEGENERATOR"] = vsg
d["__VIEWSTATE"] = vs
d["ctl00$MainContent$physicianSearchView$gvResults$ctl01$ddlPager"] = 1
d["ctl00$MainContent$physicianSearchView$gvResults$ctl01$ddlPager"] = 1
d["ctl00$MainContent$physicianSearchView$gvResults$ctl01$btnNextPage"] = "Next"
r = requests.post('http://search.cpsa.ca/PhysicianSearch', data=d,headers=h)
tree = html.fromstring(r.content)
tree = html.fromstring(r.content)
retrievedUrls = tree.xpath('//*[@id="MainContent_physicianSearchView_gvResults"]/tr/td[2]/a/@href')
print(urls)
print(retrievedUrls)
endSearch = True
...
Traceback (most recent call last):
File "C:\Users\daniel.bak\workspace\Alberta Physician Scraper\main\main.py", line 63, in <module>
ev = soup.select("#__EVENTVALIDATION")[0]["value"]
IndexError: list index out of range
Chương trình này lái xe đưa bạn về tinh thần , Vì vậy, -1 –
@BhargavRao, lol nó sẽ tồi tệ hơn nếu nó đánh bại tôi;) –
Tôi cũng đã mất trí. Cảm ơn một tấn cho sự giúp đỡ - xác minh bây giờ rằng công trình này. Tôi thực sự đã tìm ra cách giải quyết một phút trước khi bạn bỏ qua nó, lol. –