试图从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)
答案 0 :(得分:0)
这可能是因为您要搜索的信息是由客户端脚本(在这种情况下为JS)动态添加的。如果出现这种情况,我认为没有一种简单的方法可以简单地通过requests
来获取信息,可能您应该更好地分析页面脚本,并且如果真的有动力执行正确的AJAX
请求。
因此,回顾一下,您没有得到正确的结果,因为任何JS生成的内容都必须呈现在文档上。当您获取HTML页面时,您只会获取初始文档。
可能的解决方案(该解决方案仅适用于 Python 3.6 )包括使用requests-HTML而不是requests:
该库旨在使解析HTML(例如抓取网络)尽可能简单直观。
安装请求-html:pipenv install requests-html
向页面的网址发送请求:
from requests_html import HTMLSession
session = HTMLSession()
r = session.get(a_page_url)
呈现响应以获取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']
希望这会有所帮助!