使用Selenium WebDriver抓取HTML代码的问题:返回的URL和操作值与控制台值不同

问题描述 投票:0回答:2

我希望我能找到你。

作为Python和网络抓取的新手,我希望你能帮助我理解我正在处理的项目中遇到的问题。

为了给你一些背景信息,我目前正在设计一个脚本,允许居住在法国的个人自动检查可用的时间段,以安排在他们所在的地区预约法国公民身份申请流程。由于时间段非常难以获得,并且根据用户的反馈,它们来得非常快,这个过程成为许多人不断沮丧的根源。

下面的代码摘自脚本,该脚本连接到学区的网站,选择可用的展位并返回可用性页面的“action”参数。 time.sleep函数用于避免网站使用的代理超载(因为它容易出现502错误)并且我打印当前网址和操作值以验证它们是否与浏览器中的值对齐:

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import time

url = "http://www.hauts-de-seine.gouv.fr/booking/create/4462/1"
booth_selection = "//input[@value='7070'][@name='planning']"
booking_selector = "//input[@value='Etape suivante'][@name='nextButton']"
browser = webdriver.Safari()
browser.maximize_window()
browser.get(url)
time.sleep(5)

booth_selection = browser.find_element_by_xpath(booth_selection)
booth_selection.click()
time.sleep(5)
booking_submit = browser.find_element_by_xpath(booking_selector)
booking_submit.click()
browser.implicitly_wait(5)
page = browser.current_url
print(page)
agent = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}
page_response = requests.get(page, headers=agent)
soup = BeautifulSoup(page_response.text, 'lxml')
action = soup.find('form', id='FormBookingCreate').get('action')
print(action)
time.sleep(10)
browser.close()

不幸的是,从那以后情况似乎并非如此:

  • 作为一个URL,我仍然得到相同的起始网址,而不是“http://www.hauts-de-seine.gouv.fr/booking/create/4462/2
  • 对于操作值,我得到“/ booking / create / 4462/1”而不是“/ booking / create / 4462/2”,这导致我假设我将无法抓取生成的URL的HTML。

这是Safari控制台的屏幕截图供参考:HTML code of resulting page

能否帮助我理解为什么会这样,以及可以采取哪些措施来解决这个问题?

提前致谢。

python selenium selenium-webdriver web-scraping scripting
2个回答
0
投票

我想这就是你要找的东西: -

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import time
url = "http://www.hauts-de-seine.gouv.fr/booking/create/4462/1"
options = webdriver.ChromeOptions()
options.add_argument('start-maximized')
options.add_argument('disable-infobars')
options.add_argument('--disable-extensions')
browser = webdriver.Chrome(chrome_options=options,executable_path=r'\\chromedriver')
browser.get(url)
browser.find_element_by_class_name("Bligne").click()
browser.find_element_by_class_name("Bbutton").click()
page = browser.current_url
print(page)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
action = soup.find(id = 'FormBookingCreate').get('action')
print(action)

我得到的输出是: -

http://www.hauts-de-seine.gouv.fr/booking/create/4462/2

'/booking/create/4462/2'

所以我所做的是我使用了类名和id来获取所需的信息。如果需要,可以忽略选项部分。


-1
投票

不断得到504错误,虽然你需要做一些挖掘...这是因为cookies为什么不能直接访问其他URL。使用硒会非常慢,我建议只使用request来做这些事情。

import requests 
    headders = {"Host": "www.hauts-de-seine.gouv.fr",
    "Connection": "keep-alive",
    "Cache-Control": "max-age=0",
    "Upgrade-Insecure-Requests": 1,
    "DNT": 1,
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Referer": "http://www.hauts-de-seine.gouv.fr/booking/create/4462/1",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "en,en-GB;q=0.9,id;q=0.8",
    "Cookie": "eZSESSID={theCookie}; xtvrn=${AnotherCookie}$;{AnotherCookie}=-; {AnotherCookie}=1"} 

html = requests.get("http://www.hauts-de-seine.gouv.fr/booking/create/4462/2", headers=headders) 
© www.soinside.com 2019 - 2024. All rights reserved.