【问题标题】:scrape href of each product from website using python使用python从网站上抓取每个产品的href
【发布时间】:2015-03-14 16:41:09
【问题描述】:

我正在使用 beautifulsoup 来抓取此网页中每个产品的 href:http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera。这些 href 以“keywords=digital+camera”结尾 这是我的代码:

from bs4 import BeautifulSoup
import requests

url = "http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera"
keyword = "keywords=digital+camera"
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data)
for link in soup.find_all('a'):
    href = link.get('href')
    if href is None:
        continue
    elif keyword in href:  
        print href

我没有从上面的脚本中得到任何反馈,有什么可以解决的吗? 谢谢

【问题讨论】:

  • 您是否尝试过打印所有的 href 和“ctrl+f”来查看您实际上得到了您认为得到的结果?我刚刚打印了 [x.get("href") for x in soup.find_all('a')] 并没有得到任何包含字符串 "keywords=digital+camera" 的内容
  • @TehTris 是的,我试过了。我没有得到任何关键字 in。

标签: python web-scraping beautifulsoup


【解决方案1】:

亚马逊正在检测用户代理(“您的浏览器名称”)并根据该值更改内容。如果您将用户代理添加到请求中,您将获得添加了“keyword=digital+camera”的字符串。否则,你不会。

url ="http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera"
import urllib2
from bs4 import BeautifulSoup
req = urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()
soup = BeautifulSoup(html)
links = soup.find_all('a')
for l in links:
    href = l.get('href')
    title = l.get('title', '')
    if 'Sony W800/B 20.1 MP Digital' in title:
        print(href)  # prints: http://www.amazon.com/Sony-W800-Digital-Camera-Black/dp/B00I8BIBCW/ref=sr_1_2/183-0842534-8993425?s=photo&ie=UTF8&qid=1421400650&sr=1-2&keywords=digital+camera

【讨论】:

  • 谢谢。但是我不能在没有图形支持的服务器上使用这种方法。
  • @c20ad4d76fe97759aa27a0c99bff67 您不需要为此提供图形支持。我已经在命令行中完成了所有这些。只需将该标题字段添加到您的请求中,这些关键字就会出现。
  • 谢谢。即使没有Firefox,它也能很好地工作。你能解释一下你为什么选择 Mozilla/5.0 吗?
  • @c20ad4d76fe97759aa27a0c99bff67 我选择了任何随机用户代理。请注意,许多浏览器(包括 Safari)在其full name user agent strings 中都有“Mozilla”。例如:Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3
  • @c20ad4d76fe97759aa27a0c99bff67 不,因为通常headless browser 也会解释 javascript 并且可能还会做其他事情。添加该用户代理标头只是您的脚本对亚马逊网络服务器说“嗨,我正在使用这个浏览器:Mozilla/5.0”的一种方式。服务器不知道你是否在撒谎。但是在这个过程中从不使用 GUI。它只是一个标识字符串。从这个意义上说,它是无头的。在 Wikipedia 上阅读有关 user-agent spoofing 的更多信息。
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多