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

Posted

技术标签:

【中文标题】使用 BS4 或 Selenium 从 finishline.com 抓取网页【英文标题】:Web scraping from finishline.com using BS4 or Selenium 【发布时间】:2019-09-03 06:03:22 【问题描述】:

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

我尝试使用 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()

这两个 sn-ps 都是从产品页面获取产品标题的尝试。

Beautifulsoup 4 sn-p 有时只是卡住,什么也不做,有时又返回

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

Selenium sn-p 返回

<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,这也是网站本身有时在浏览器中返回的内容。可以通过清除cookies绕过。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我忘记包含我之前使用失败的标题,但是使用您的标题似乎确实有效。非常感谢,我的问题好像解决了!【参考方案2】:

试试这个,对我来说它有效,它返回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)

【讨论】:

非常感谢,它确实有效。对于这个特定的程序,我决定使用 BS4

以上是关于使用 BS4 或 Selenium 从 finishline.com 抓取网页的主要内容,如果未能解决你的问题,请参考以下文章

使用 selenium 和 bs4 进行网页抓取

在 Python 中使用 BS4、Selenium 抓取动态数据并避免重复

使用 selenium 和 bs4 抓取网站不起作用

“AttributeError:‘str’对象没有属性‘descendants’错误,使用 bs4 和 selenium 进行自动抓取

selenium+python自动化89-用例不通过的时候发送邮件

selenium+python自动化89-用例不通过的时候发送邮件