我想登录一个网站,在页面上执行搜索,然后抓取所有结果。
我以某种方式设法使用 Python 和请求登录,但是当我在页面上执行 get 请求时,我想执行搜索,或者每当我在该页面上执行发布请求并在正文中传递所有搜索条件时,我并没有真正得到任何搜索结果。相反,标题仍然显示"登录到页面",这是登录页面的标题,因此似乎我在登录后无法执行任何 REST 操作。 当需要登录然后执行搜索时,是否有任何特定方法可以抓取网站?
以下是我的尝试:
import requests
from lxml import html
from bs4 import BeautifulSoup
USERNAME = "abcdefgh"
PASSWORD = "xxxxxxx"
LOGIN_URL = "https://www.assortis.com/en/login.asp"
URL = "https://www.assortis.com/en/members/bsc_search.asp?act=sc"
SEARCH_URL = "https://www.assortis.com/en/members/bsc_results.asp"
def scrapeIt():
session_requests = requests.session()
#login
result = session_requests.get(LOGIN_URL)
tree = html.fromstring(result.text)
# print(tree)
# Create payload
payload = {
"login_name": USERNAME,
"login_pwd": PASSWORD,
"login_btn": "Login"
}
search_payload = {
'mmb_cou_hid': '0,0',
'mmb_don_hid': '0,0',
'mmb_sct_hid': '0,0',
'act': 'contract',
'srch_sdate': '2016-01-01',
'srch_edate': '2018-12-31',
'procurement_type': 'Services',
'srch_budgettype': 'any',
'srch_budget': '',
'srch_query': '',
'srch_querytype': 'all of the words from'
}
# Perform login
result = session_requests.post(LOGIN_URL, data=payload, headers=dict(referer=LOGIN_URL))
# Scrape url
result = session_requests.get(URL, headers=dict(referer=URL))
result = session_requests.post(SEARCH_URL, data=search_payload, headers=dict(referer=SEARCH_URL))
content = result.content
# print(content)
data = result.text
soup = BeautifulSoup(data, 'html.parser')
print(soup)
scrapeIt()
编辑:网页可能是JavaScript。
将 response.text 保存到本地文件 登录后,要查看您是否实际登录,请检查文件否则,与其对 http 请求进行逆向工程,不如尝试 Selenium chromedriver。
在Selenium上日志记录部分更容易,但在页面上查找内容则不然,使用等待异常进行动态加载,driver.page_source查看html,有时浏览器写html不同,即:<tbody>
标签