【发布时间】:2020-09-10 16:15:33
【问题描述】:
我正在尝试在 Udemy 课程“使用 Python 自动化无聊的东西”中了解网络抓取。
我正在尝试将 Python 与 requests 和 BeautifulSoup 模块以及 CSS 选择器一起使用来返回给定亚马逊商品的价格。
我可以在课程中看到很多人无法让这个工作,所以我怀疑亚马逊网页发生了一些变化。但是,我也尝试过其他一些网页,例如currys.co.uk 似乎也无法让它在那里工作。
BeautifulSoup 似乎可以很好地解析所有内容,我认为问题不存在,只是当我尝试从 Chrome 获取 CSS 选择器时,一切都不起作用。
例如,在这个网页上:
https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994
如果我右键点击价格,点击“检查”,然后复制->复制选择器,我得到
#unqualifiedBuyBox > div > div.a-text-center.a-spacing-mini > span
我很确定这不是我正在寻找的 CSS 选择器,将它放入我的 Python 代码不会返回价格。
我在这里做错了吗?
感谢您的帮助。
【问题讨论】:
-
许多页面使用 JavaScript 向页面添加元素,但
BeautifulSoup无法运行 JavaScript - 因此通常无法获取元素。然后你可能需要 Selenium 来控制可以运行 JavaScript 的网络浏览器。或者您可以尝试在 Firefox/Chrome 中使用DevTools(选项卡:网络,过滤器:XHR)来查找 JavaScript 用于读取数据的 url,然后您可以使用requests从该 url 获取数据 - 通常您会获取数据JSON 格式,所以你不需要BeautifulSoup -
顺便说一句:关闭网页浏览器中的 JavaScript 并重新加载页面以查看
BeautifulSoup可以从服务器获取什么。 -
一些服务器为不同的设备发送不同的 HTML - 手机、平板电脑、台式机 - 所以使用正确的标题
User-Agent可能很重要。其他服务器可以识别您运行脚本并发送带有警告的页面并阻止您 - 因此您可以将 HTML 保存到页面并显示在 Web 浏览器中以查看您得到的结果。 -
除了亚马逊想要阻止爬虫之外,您还缺少
#符号。在 chrome 控制台上试试这个:$("#unqualifiedBuyBox > div > div.a-text-center.a-spacing-mini > span").innerText -
@BalajiAmbresh OP 在 CSS 选择器中已经有
#,但 OP 的文本格式不正确,Stackoverflow 使用#将其显示为粗体文本 :)
标签: python css google-chrome web-scraping beautifulsoup