使用 BS4 或硒从 finishline.com 抓取网页



我正在尝试使用Selenium或Beautifulsoup 4从 https://www.finishline.com 中抓取数据。到目前为止,我一直没有成功,所以我转向 Stackoverflow 寻求帮助 - 希望有人知道绕过他们的刮擦保护的方法。

我尝试使用Beautifulsoup 4和Selenium。下面是一些简单的例子。

我的主程序中使用的常规导入:

import requests
import csv
import io
import os
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from datetime import datetime
from bs4 import BeautifulSoup

美汤4代码:

data2 = requests.get("https://www.finishline.com/store/product/mens-nike-air-max-95-se-casual-shoes/prod2783292?styleId=AJ2018&colorId=004")
soup2 = BeautifulSoup(data2.text, 'html.parser')
x = soup2.find('h1', attrs={'id': 'title'}).text.strip()
print(x)

硒代码:

options = Options()
options.headless = True
options.add_argument('log-level=3')
driver = webdriver.Chrome(options=options)
driver.get("https://www.finishline.com/store/product/mens-nike-air-max-95-se-casual-shoes/prod2783292?styleId=AJ2018&colorId=004") 
x = driver.find_element_by_xpath("//h1[1]")
print(x)
driver.close()

这两个代码段都是尝试从产品页面获取产品标题。

Beautifulsoup 4 片段有时只是卡住什么也不做,有时它会返回

requests.exceptions.ConnectionError: ('Connection aborted.', OSError("(10060, 'WSAETIMEDOUT')"))

硒片段返回

<selenium.webdriver.remote.webelement.WebElement (session="b3707fb7d7b201e2fa30dabbedec32c5", element="0.10646785765405364-1")>

这意味着它确实找到了该元素,但是当我尝试通过更改将其转换为文本时

x = driver.find_element_by_xpath("//h1[1]")

x = driver.find_element_by_xpath("//h1[1]").text

它返回Access Denied,这也是网站本身有时在浏览器中返回的内容。可以通过清除 cookie 来绕过它。

有谁知道从这个网站抓取数据的方法?提前谢谢。

由于用户代理,请求被服务器拒绝,我在请求中添加了用户代理。

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
data2 = requests.get("https://www.finishline.com/store/product/mens-nike-air-max-95-se-casual-shoes/prod2783292?styleId=AJ2018&colorId=004",headers=headers)
soup2 = BeautifulSoup(data2.text, 'html.parser')
x = soup2.find('h1', attrs={'id': 'title'}).text.strip()
print(x)

输出:

Men's Nike Air Max 95 SE Casual Shoes

试试这样,对我来说它有效,它返回MEN'S NIKE AIR MAX 95 SE CASUAL SHOES

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
driver = webdriver.Chrome()
driver.get("https://www.finishline.com/store/product/mens-nike-air-max-95-se-casual-shoes/prod2783292?styleId=AJ2018&colorId=004")
x = driver.find_element_by_xpath('//*[@id="title"]')
print(x.text)

最新更新