python - 无法使用请求从网页中获取某些字段
问题描述
我正在尝试使用模块从该网页requests
获取不同容器的标题和链接,但我找不到任何方法。我试图找到通常会出现在开发工具中的任何隐藏 API,但我失败了。我注意到不同的时间,大多数时候动态生成的内容在某些脚本标签中可用。但是,在这种情况下,我也无法在其中找到内容。作为最后的手段,我使用 Selenium 来抓取它们。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
link = 'https://www.firmy.cz/kraj-praha?q=prodej+kol'
def get_content(url):
driver.get(url)
for item in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,'.companyDetail'))):
item_link = item.find_element_by_css_selector("h3 > a.companyTitle").get_attribute("href")
item_title = item.find_element_by_css_selector("span.title").text
yield item_link,item_title
if __name__ == '__main__':
with webdriver.Chrome() as driver:
wait = WebDriverWait(driver,10)
for item in get_content(link):
print(item)
脚本产生的结果如下:
('https://www.firmy.cz/detail/12824790-bike-gallery-s-r-o-praha-vokovice.html', 'Bike Gallery s.r.o.')
('https://www.firmy.cz/detail/13162651-bikeprodejna-cz-praha-dolni-chabry.html', 'BIKEPRODEJNA.CZ')
('https://www.firmy.cz/detail/406369-bikestore-cz-praha-podoli.html', 'Bikestore.cz')
('https://www.firmy.cz/detail/12764331-shopbike-cz-praha-ujezd-nad-lesy.html', 'Shopbike.cz')
如何使用 requests 模块获取相同的结果?
解决方案
分析了原始页面源后,解决方案似乎非常简单——您必须在_escaped_fragment_=
链接中附加一个额外的 URL 参数。例如,获取所需内容的简单 Python 脚本可以如下:
import requests
r = requests.get('https://www.firmy.cz/kraj-praha?q=prodej+kol&_escaped_fragment_=')
print (r.content)
下面的 Python 脚本使用requests
并解析收到的响应来模拟您当前的实现:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
base = 'https://www.firmy.cz'
link = 'https://www.firmy.cz/kraj-praha?q=prodej+kol&_escaped_fragment_='
def get_info(url):
r = requests.get(url)
soup = BeautifulSoup(r.text,"lxml")
for item in soup.select(".companyDetail"):
item_link = urljoin(base,item.select_one("h3 > a.companyTitle")['href'])
item_title = item.select_one("span.title").get_text(strip=True)
yield item_link,item_title
if __name__ == '__main__':
for item in get_info(link):
print(item)
在执行之前,请确保您已通过在中运行以下命令来安装所需的库cmd
:
pip install bs4
pip install html5lib
pip install lxml
推荐阅读
- javascript - ES6 模块在 Safari mobile (iOS14.6) 上失败
- c# - 以异步方法获取剪贴板文本
- python - Python3 - 如何迭代和删除 CSV 中的条目?
- c - OpenWrt Makefile 包含 package.mk 错误
- mysql - 如何加入带有小型文本数据集的表格?
- json - 在flutter中从json api获取数据时出错
- python - 如何使用pyspark计算两个ArrayType列之间的元素乘法
- python - Python程序使用递归函数问题来反转数字
- azure - 在 Azure 中配置和验证 Vnet
- c++ - 如何在c ++中的静态成员函数中使用指向成员函数的指针