【问题标题】:Python requests not returning fully loaded contentPython 请求未返回完全加载的内容
【发布时间】:2019-06-20 13:12:22
【问题描述】:

尝试从here 获取大小。

我想要的内容:

但是我收到了:

[<div class="options" id="productSizeStock">
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>
<button class="btn options-loading" disabled="" type="button">
</button>

我还尝试使用requests-html 来查看是否是 javascript 渲染问题。但我只是收到空值。

这是我的代码:

import requests
import randomheaders
from bs4 import BeautifulSoup

proxy = {'''PROXY'''}
while True:
    try:
        source = requests.get("https://www.size.co.uk/product/grey-nike-air-max-98-se/132114/", proxies= proxy, headers=randomheaders.LoadHeader(),timeout=30).text
        soup = BeautifulSoup(source, features = "lxml")
        print(soup.find_all("div", class_="options"))

    except Exception as e:
        print(e)

    time.sleep(5)

【问题讨论】:

    标签: python html beautifulsoup python-requests


    【解决方案1】:

    这可能是因为您正在搜索的信息是由客户端脚本(在本例中为 JS)动态添加的。如果是这种情况,我看不到一个简单的方法来简单地使用requests 获取信息,也许你应该更好地分析页面脚本,如果真的有动机执行正确的AJAX 请求。

    因此,回顾一下,您没有得到正确的结果,因为任何 JS 生成的内容都必须在文档上呈现。当您获取 HTML 页面时,您只获取初始文档。

    一个可能的解决方案(该解决方案仅适用于 Python 的 3.6)在于使用 requests-HTML 而不是 requests

    这个库旨在使解析 HTML(例如抓取网页)尽可能简单和直观。

    1. 安装 requests-html:pipenv install requests-html

    2. 向页面的 url 发出请求:

      from requests_html import HTMLSession
      
      session = HTMLSession()
      r = session.get(a_page_url)
      
    3. 渲染响应以获取 Javascript 生成的位:

      r.html.render()
      

    此模块提供scraping 和 JavaScript 支持,这正是您所需要的。

    【讨论】:

    • 感谢@AlexGidan 回复!我有一种感觉,谢谢你澄清了这一点。当 requests-html 时,我在上面提到过,在尝试它时,我没有被退回?这是代码r = session.get("https://www.size.co.uk/product/grey-nike-air-max-98-se/132114/",proxies = proxy) print(r.html.render(timeout=20))
    【解决方案2】:

    从技术角度来看,您的代码是正确的。由于本网站使用 Javascript 来呈现自身,因此大小存储在不同的 URL 上,如下所示:

    https://www.size.co.uk/product/grey-nike-air-max-98-se/132114/stock
    

    如您所见,您只需将 /stock 添加到您的初始 URL。


    话虽如此,请尝试替换:

    source = requests.get("https://www.size.co.uk/product/grey-nike-air-max-98-se/132114/", proxies= proxy, headers=randomheaders.LoadHeader(),timeout=30).text
    soup = BeautifulSoup(source, features = "lxml")
    print(soup.find_all("div", class_="options"))
    

    与:

    source = requests.get("https://www.size.co.uk/product/grey-nike-air-max-98-se/132114/stock", proxies= proxy, headers=randomheaders.LoadHeader(),timeout=30).text
    soup = BeautifulSoup(source, features = "lxml")
    sizes = [x["title"].replace("Select Your UK Size ","") for x in soup.find_all("button",{"data-e2e":"product-size"})]
    print(sizes)
    

    其中sizes 是一个包含所有尺寸的列表,并具有以下输出:

    ['6', '7', '7.5', '8', '8.5', '9', '9.5', '10', '10.5', '11', '11.5', '12']
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复!你能打到服务吗?我一直有连接超时问题:(stackoverflow.com/questions/56691190/…
    • @kyraaan 嗯,在这种情况下,我很确定您的代理存在问题。你检查过吗?
    • 我认为你是对的!通过切换代理,我现在设法每隔一段时间就得到响应。但它非常不一致,即使有 1000000 超时
    • 尝试在不使用代理的情况下发送请求并告诉我它是否有效
    • 已禁用代理,现在超时时间增加得更多,而且我得到更频繁的响应。非常感谢你的帮助!我猜这个网站很慢哈哈
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2019-01-29
    • 2018-07-19
    • 2023-04-02
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多