【问题标题】:requests_html returns blackrequests_html 返回黑色
【发布时间】:2020-06-23 09:20:15
【问题描述】:
    Python 3.8.2 (default, Apr  8 2020, 14:31:25) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from requests_html import HTMLSession
>>> session = HTMLSession()
>>> r = session.get('https://www.sahibinden.com/ilan/emlak-konut-gunluk-kiralik-holiday-business-suit-lux-otel-konforunda-suit-daireler-803346031/detay')
>>> r.html.find("#classifiedId")
[]

我运行了这段代码,但输出为空。我试过r.html.render(),但结果没有改变。我也尝试用 xpath 找到它,但仍然没有结果。我该如何解决?

【问题讨论】:

  • 在我看来,网页源中没有id=classifiedId的元素。
  • 您想获取什么信息?只有Classified Id?
  • i.imgur.com/sIuaCqO.png @Dmitry 但是,您应该通过 python 代码再次检查。获取原始内容。他们可能会发送较少的信息,例如使用通用用户代理。
  • @TinNguyen 你应该先登录这个网站。此网页未经登录无法打开。您可以使用 Python 以编程方式完成这些步骤。
  • 有一个具有该 id 的元素。我正在尝试在右侧获取列表。用户代理是 Chrome。它不需要登录。

标签: python python-3.x web-scraping python-requests-html


【解决方案1】:

该站点需要您指定User-Agent 和一个名为"s3IssGuY1" 的cookie。如果这个 cookie 需要随着时间(以及何时)改变我不知道,但你可以相应地改变它(来自 Firefox/Chrome 开发者工具):

import requests
from bs4 import BeautifulSoup


headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0'}
url = 'https://www.sahibinden.com/ilan/emlak-konut-gunluk-kiralik-holiday-business-suit-lux-otel-konforunda-suit-daireler-803346031/detay'
cookies = {'s3IssGuY1': 'A_Lne-ByAQAAWJ_crjFYgFyVj0loVQQA3jwlYwVTH-vnpfLSbIkEJkwRS9NDAVX4a-mcuNvjwH8AADQwAAAAAA=='}
soup = BeautifulSoup(requests.get(url, headers=headers, cookies=cookies).content, 'html.parser')

for st, sp in zip(soup.select('.classifiedInfoList strong'), soup.select('.classifiedInfoList span')):
    print('{:<30} {}'.format(st.get_text(strip=True), sp.get_text(strip=True)))

打印:

İlan No                        803346031
İlan Tarihi                    23 Haziran 2020
Emlak Tipi                     Günlük Kiralık Daire
m² (Brüt)                      35
m² (Net)                       30
Oda Sayısı                     Stüdyo (1+0)
Bulunduğu Kat                  5
Kat Sayısı                     5
Isıtma                         Merkezi
Banyo Sayısı                   1
Site İçerisinde                Hayır
Kimden                         Emlak Ofisinden

【讨论】:

  • 最后一行没看懂。你能解释一下吗?
  • @enes3626 最后一行print() 只打印formatted string:第一个值左对齐,固定为字符串(30 个字符)
  • 非常感谢您的帮助。你是生命的救星。
【解决方案2】:

如果浏览器不需要你打开或者不打开,你可以用selenium打开你的系统浏览器,直接访问元素。

第一:

你需要安装chrome或firefox驱动

秒:

需要用 pip 在你的 python 中安装 selenium

第三个:

在你的文本编辑器或 ide 中编写这些代码

from selenium import webdriver
from time import sleep

driver = webdriver.FireFox(executable_path="your driver path in your pc or laptop")
driver.get("your url")

sleep(10)

elem = driver.find_element_by_xpath("use xpath here")

print(elem.text)

driver.close()

【讨论】:

  • 我知道硒,但它太慢了。
  • 所以你需要使用浏览器中的network部分根据响应找到合适的请求。
  • 我认为这个页面是用 javascript 加载的,所以你需要使用我说的方式
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多