Python请求未返回完全加载的内容

时间:2019-06-20 13:12:22

标签: python html beautifulsoup python-requests

试图从here获得尺寸。

我想要的内容:

enter image description 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)

2 个答案:

答案 0 :(得分:0)

这可能是因为您要搜索的信息是由客户端脚本(在这种情况下为JS)动态添加的。如果出现这种情况,我认为没有一种简单的方法可以简单地通过requests来获取信息,可能您应该更好地分析页面脚本,并且如果真的有动力执行正确的AJAX请求。

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

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

  

该库旨在使解析HTML(例如抓取网络)尽可能简单直观。

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

  2. 向页面的网址发送请求:

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

    r.html.render()
    

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

答案 1 :(得分:0)

从技术角度来看,您的代码是正确的。由于该网站使用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']

希望这会有所帮助!