Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用BS4从eastbay.com刮取数据?_Python_Selenium_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 无法使用BS4从eastbay.com刮取数据?

Python 无法使用BS4从eastbay.com刮取数据?,python,selenium,web-scraping,beautifulsoup,Python,Selenium,Web Scraping,Beautifulsoup,因此,我选择了我感兴趣的品牌,并生成了以下URL: 我正试图从这个页面中获取数据,主要是产品页面URL(href带有类链接--product的a元素的属性值) 我的第一个问题是,使用BS4,我无法从网站上获取任何数据 即使运行这个简单的测试片段(忽略大多数导入,它们也会在主程序中使用) 它应使用类主(结果应为Nike Air Force 1 Low)打印第一个span元素中的文本,返回错误requests.exceptions.ConnectionError:('Connection abor

因此,我选择了我感兴趣的品牌,并生成了以下URL:

我正试图从这个页面中获取数据,主要是产品页面URL(
href
带有类
链接--product
a
元素的属性值)

我的第一个问题是,使用BS4,我无法从网站上获取任何数据

即使运行这个简单的测试片段(忽略大多数导入,它们也会在主程序中使用)

它应使用类
(结果应为
Nike Air Force 1 Low
)打印第一个
span
元素中的文本,返回错误
requests.exceptions.ConnectionError:('Connection aborted',OSError('10060,'WSAETIMEDOUT'))
,这应该表明主机不接受我的头,但我尝试了许多不同的头,但都没有成功

我让Selenium工作,并使用以下简单片段显示
Nike Air Force 1 Low

driver = webdriver.Chrome()
driver.get("https://www.eastbay.com/category/sport/casual/mens/shoes.html") 
x = driver.find_element_by_xpath("//span[@class='primary']")
print(x.text)
driver.close()
但如果可能的话,我更愿意使用BS4。有人知道如何让BS4与此网站配合使用吗

我的第二个问题是关于这个网站的分页。在URL的底部附近,有一个“加载更多”按钮,它向API发出请求,然后加载下一批产品。然而,URL永远不会改变。有谁能帮我迭代这些批次,以便获取所有产品,而不仅仅是前60个

我尝试了类似的方法,根据另一个网站的脚本进行修改,该脚本在URL中也没有分页:

url = "https://www.eastbay.com/category/mens/shoes.html?query=%3Arelevance%3Agender%3A200000%3AproductType%3A200005%3Abrand%3AChampion%3Abrand%3AConverse%3Abrand%3AFila%3Abrand%3AJordan%3Abrand%3ANew+Balance%3Abrand%3ANike%3Abrand%3ANike+SB%3Abrand%3APUMA%3Abrand%3AReebok%3Abrand%3ASalomon%3Abrand%3AThe+North+Face%3Abrand%3ATimberland%3Abrand%3AUGG%3Abrand%3AUnder+Armour%3Abrand%3AVans%3Abrand%3Aadidas%3Abrand%3Aadidas+Originals"

qsp = {
    'currentPage': 1,
    'pageSize': 100,
    'timestamp': 3
}

container = []


for page_content in range(0,1500,60):
    qsp['currentPage'] = page_content
    res = requests.get(url,params=qsp,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"})
    soup = BeautifulSoup(res.text, 'lxml')
    for item in soup.select(".c-product-card a"):
        container.append("https://www.eastbay.com"+item['href'])

    for items in soup.select("script"):
        sauce = BeautifulSoup(items.text,"lxml")
        for elem in sauce.select(".c-product-card a"):
            container.append("https://www.eastbay.com"+elem['href'])

print(container)
但这要么会导致一个空列表,要么就卡住了

我已经在Chrome开发工具的网络选项卡中检查了XHR和Fetch选项卡,我可以看到点击“加载更多”按钮发出的是什么样的请求,但在传递查询字符串参数以迭代批量产品时,我却一无所知


非常感谢您的帮助。

您对XHR的想法是正确的。下面是如何获得它,然后迭代该json格式以打印出所需的输出:

import requests

url = 'https://www.eastbay.com/api/products/search'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

payload = {
'query': ':relevance:sport:Casual:gender:200000:productType:200005',
'currentPage': '1',
'pageSize': '200',
'timestamp': '4'}

jsonData = requests.get(url, headers=headers, params=payload).json()

totalPages = jsonData['pagination']['totalPages']
totalResults = jsonData['pagination']['totalResults']

print ('%s total results to aquire' %totalResults)


for page in range(1,totalPages+1):
    payload = {
            'query': ':relevance:sport:Casual:gender:200000:productType:200005',
            'currentPage': page,
            'pageSize': '200',
            'timestamp': '4'}


    jsonData = requests.get(url, headers=headers, params=payload).json()

    try:
        for product in jsonData['products']:
            print (product['name'])
    except:
        print ('Products not found on this request')

若页面使用JavaScript,那个么就不能使用requsets+BS。您可以运行Selenium并从Selenium(page_源代码)获取HTML,并在BS中使用。但Selenium有自己的方法从页面获取数据。更难的方法是:JavaScript从某个url读取数据。如果您在Chrome/Firefox的DevTools中找到这个url,那么您可以尝试使用
请求来读取它。但是JavaScript可能还需要cookies、会话,并且它可以加密数据,因此有时很难对请求执行同样的操作。我将看看是否可以在程序的一部分使用Selenium,在另一部分使用BS4。非常感谢您的帮助。当我尝试复制和粘贴此代码时,会收到
requests.exceptions.ConnectionError:(“连接已中止”)、OSError((10060,“WSAETIMEDOUT”))
错误。我正在使用VPN访问此网站,因为如果没有来自欧洲的VPN,我将无法访问此网站。问题可能出在VPN上吗?打开VPN后,当我在浏览器中打开该网站时,该网站会正常工作。你能告诉我这个代码的输出是什么吗?非常感谢。可能是VPN。我正在接收与查询相关的所有产品数据的输出。上面的代码只是打印出产品名称。我尝试使用另一个VPN,结果成功了。我还设法使用代码返回的数据来构建产品页面URL,现在我正在从这些URL获取数据。非常感谢你,没有你的帮助我是做不到的。太棒了!很高兴它帮了你。
import requests

url = 'https://www.eastbay.com/api/products/search'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

payload = {
'query': ':relevance:sport:Casual:gender:200000:productType:200005',
'currentPage': '1',
'pageSize': '200',
'timestamp': '4'}

jsonData = requests.get(url, headers=headers, params=payload).json()

totalPages = jsonData['pagination']['totalPages']
totalResults = jsonData['pagination']['totalResults']

print ('%s total results to aquire' %totalResults)


for page in range(1,totalPages+1):
    payload = {
            'query': ':relevance:sport:Casual:gender:200000:productType:200005',
            'currentPage': page,
            'pageSize': '200',
            'timestamp': '4'}


    jsonData = requests.get(url, headers=headers, params=payload).json()

    try:
        for product in jsonData['products']:
            print (product['name'])
    except:
        print ('Products not found on this request')