【问题标题】:Python (Selenium/BeautifulSoup) Search Result Dynamic URLPython (Selenium/BeautifulSoup) 搜索结果动态 URL
【发布时间】:2019-04-25 10:38:16
【问题描述】:

免责声明:这是我第一次涉足网络抓取

我有一个与搜索结果对应的 URL 列表,例如,

http://www.vinelink.com/vinelink/servlet/SubjectSearch?siteID=34003&agency=33&offenderID=2662

我正在尝试使用 Selenium 访问结果的 HTML,如下所示:

for url in detail_urls:
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.prettify())

但是,当我梳理得到的美化汤时,我注意到我需要的组件丢失了。回顾页面加载过程,我看到 URL 重定向了几次,如下所示:

  1. http://www.vinelink.com/vinelink/servlet/SubjectSearch?siteID=34003&agency=33&offenderID=2662

  2. https://www.vinelink.com/#/searchResults/id/offender/34003/33/2662

  3. https://www.vinelink.com/#/searchResults/1

谁有关于如何访问最终搜索结果数据的提示?

更新:经过进一步探索,这似乎与正在执行以检索相关数据进行显示的脚本有关...... page_source 中引用了许多与搜索结果相关的脚本;有没有办法确定哪个是相关的?

我可以根据这张图片检查我需要的信息:

【问题讨论】:

  • 您尝试访问哪些组件? (但不可用)Selenium 应该在返回要被 BeautifulSoup 解析的 html 对象之前加载所有 javascript
  • 嗨约瑟夫,我正在尝试从最终目标页面访问 标记(根据我的问题,如果我要在 Chrome 搜索栏中输入原始 URL 之一,则页面将按顺序加载,我会看到 URL 更改两次,直到它降落在 '/#/searchResults/1' 上(无论搜索的罪犯是相同的 URL)——知道如何确保 Selenium 不会从重定向系列中的第一个 URL?
  • 当我尝试连接到提供的链接时,我被重定向到未经授权的页面vinelink.com/#/unauthorized 根据我的经验和测试,driver.get(url) 之后的行仅在浏览器完成后执行加载。 Selenium 旨在模拟与人类相同的网页浏览体验。您能否确认您从 driver.page_source 收到的 html 与您自己浏览时收到的 html 不同?
  • 尝试调用soup.find_all("search-result") 以确认您没有获得所需的数据
  • 嗨约瑟夫,根据你写的内容,我发现我实际上可以绕过 driver.page_source 调用,而是在开始抓取数据之前插入 driver.implicitly_wait(5) (这允许足够浏览仿真到达目标页面的时间)。非常感谢!我现在遇到了一个新问题(reCAPTCHA 阻止我从列表中的多个 URL 收集数据),但我将为此创建一个单独的问题!

标签: python selenium selenium-webdriver beautifulsoup


【解决方案1】:

一旦你有你的soup 变量和 HTML,请按照下面的代码..

import json
data = soup.find('search-result')['data']
print(data)

输出: 现在将每个值视为字典。

{"offender_sid":154070373,"siteId":34003,"siteDesc":"NC_STATE","first_name":"WESLEY","last_name":"ADAMS","middle_initial":"CHURCHILL","alias_first_name":null,"alias_last_name":null,"alias_middle_initial":null,"oid":"2662","date_of_birth":"1965-11-21","agencyDesc":"Durham County Detention Center","age":53,"race":2,"raceDesc":"African American","gender":null,"genderDesc":null,"status_detail":"Durham County Detention Center","agency":33,"custody_status_cd":1,"custody_detail_cd":33,"custody_status_description":"In Custody","aliasFlag":false,"registerValid":true,"detailAgLink":false,"linkedCases":false,"registerMessage":"","juvenile_flg":0,"vineLinkInd":1,"vineLinkAgAccessCd":2,"links":[{"rel":"agency","href":"//www.vinelink.com/VineAppWebService/api/site/agency/34003/33"},{"rel":"self","href":"//www.vinelink.com/VineAppWebService/api/offender/?offSid=154070373&lang=en_US"}],"actions":[{"name":"register","template":"//www.vinelink.com/VineAppWebService/api/register/{json data}","method":"POST"}]}

下一步:

info = json.loads(data)

print(info['first_name'], info['last_name'])

#This prints the first and last name but you can get others, just get the key like 'date_of_birth' or 'siteId'. You can also assign them to variables.

【讨论】:

  • 感谢您的建议!我认为由于与搜索结果创建过程的动态 URL 相关的某些内容,我没有为最终目的地使用正确的 HTML,因此“汤”变量不包含正确的 HTML,我收到以下错误: 'TypeError:'NoneType' 对象不可下标'。有什么方法可以让 Selenium 完成 URL 更改过程并拉取正确的页面?
  • 我现在实际上已经按照 Joseph Choi 在 cmets 中的建议解决了问题;我只是在加载原始 URL 后插入了一个 driver.implicitly_wait(5),然后在到达重定向的最终目的地之前,不会开始进一步的 Selenium 命令。
猜你喜欢
  • 2019-08-04
  • 2013-04-03
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
相关资源
最近更新 更多