【问题标题】:Webscraping Amazon with BeautifulSoup使用 BeautifulSoup 抓取亚马逊网页
【发布时间】:2018-11-20 00:10:49
【问题描述】:

我正在尝试抓取亚马逊的评论:https://www.amazon.com/Python-Crash-Course-Hands-Project-Based/dp/1593276036/ref=sr_1_3?ie=UTF8&qid=1541450645&sr=8-3&keywords=python

这是我的代码:

import requests as req
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Kevin\'s_request'}
r = req.get('https://www.amazon.com/Python-Crash-Course-Hands-Project-Based/dp/1593276036/ref=sr_1_3?ie=UTF8&qid=1541450645&sr=8-3&keywords=python', headers=headers)
soup = BeautifulSoup(r.text, "html.parser")
soup.find(class_="a-expander-content a-expander-partial-collapse-content")

我只得到一个空列表。我在 Jupyter Notebooks 和 BS 4 中使用 Python 3.6.4

【问题讨论】:

  • 在我端向 URL 发送请求时,我收到 503 HTTP 状态代码。检查您身边的状态码。如果使用requests 库,您可以执行r.status_code 其中rrequests.get()
  • 我这样做了,但之前把那部分遗漏了。我编辑了我的问题以反映那部分。一切似乎工作正常,但 .find_all(...) 获取文本。它只返回一个空列表。当我在另一个网站上使用相同的代码时,它可以工作。
  • 评论包含在另一个名为 a-section reviewdiv 中。见here。尝试len(soup.findAll(class_='a-section review')) 时,结果为 8,即显示的评论数。
  • 我明白你在说什么,但是当我这样做时 len(soup.findAll(class_='a-section review')) 我得到的长度为 0 我一定是做错了什么。
  • 我用soup = BeautifulSoup(r.text, "html.parser") 初始化它我应该删除"html.parser" 吗?

标签: python web-scraping beautifulsoup findall


【解决方案1】:

试试这个方法。结果你的选择器找不到任何东西。但是,我已对其进行了修复以达到目的:

import requests
from bs4 import BeautifulSoup

def get_reviews(s,url):
    s.headers['User-Agent'] = 'Mozilla/5.0'
    response = s.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    return soup.find_all("div",{"data-hook":"review-collapsed"})

if __name__ == '__main__':
    link = 'https://www.amazon.com/Python-Crash-Course-Hands-Project-Based/dp/1593276036/ref=sr_1_3?ie=UTF8&qid=1541450645&sr=8-3&keywords=python'    
    with requests.Session() as s:
        for review in get_reviews(s,link):
            print(f'{review.text}\n')

【讨论】:

  • 使用这种语法,我假设只有一个 get 并且当你在此处循环 for review in get_reviews(s,link) 你是- 使用返回的对象?我对这个库和语法还不够熟悉,还无法理解我假设的效率。
【解决方案2】:

不确定您这边发生了什么,但这段代码可以正常工作。 在这里(python 3.6,BSP 4.6.3):

import requests
from bs4 import BeautifulSoup

def s_comments(url):
    headers = {'User-Agent': 'Bob\'s_request'}
    response = requests.get(url, headers=headers )
    if response.status_code != 200:
        raise ConnectionError

    soup = BeautifulSoup(response.content)
    return soup.find_all(class_="a-expander-content a-expander-partial- collapse-content")


url = 'https://www.amazon.com/dp/1593276036'    
reviews = s_comments(url)
for i, review in enumerate(reviews):
    print('---- {} ----'.format(i))
    print(review.text)

【讨论】:

  • 当我使用此代码时,我仍然得到一个空列表。会不会是我这边的事情?
  • 是的。尝试打印您收到的回复,例如:
  • print(response.content) 以及您解析的对象。像soup.prettify()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多