1

我一直在尝试为 yelp 编写爬虫。我想获取该页面上提供的供应商的链接,我知道它是在 href=" 中给出的,但是数组返回总是空的,请帮助!提前谢谢你:)

    import urllib
    import mechanize
    from bs4 import BeautifulSoup
    import re

    br = mechanize.Browser()
    br.set_handle_robots(False)
    br.addheaders= [('User-agent', 'chrome')]

    BASE_URL = "http://www.yelp.com/"
    regex = "u(?!.*u).*,"
    patern =re.compile(regex)

    search = "house cleaner"
    location ="London, Uk"
    term = search.replace(" ","+")
    place = location.replace(",","%2C").replace(" ","+")
    query = BASE_URL+"search?find_desc="+term+"&find_loc="+place+"&ns=1#start=0"
    html = br.open(query).read()
    soup = BeautifulSoup(html)
    results = soup.findAll('ul',attrs={'class':'ylist ylist-bordered search-results'})
    results_parse = str(results)
    soup1 = BeautifulSoup(results_parse)
    names =soup1.findAll("li")
    for li in names:
        soup2=BeautifulSoup(str(li))
        links=soup2.findAll("a")
        links_parse = links[0]
        vendor_links=[a["href"] for a in links]
        out= re.findall(patern,str(vendor_links))
        print out
4

1 回答 1

2

这是解决使您的代码按照您的意愿执行的字面问题的解决方案(但请参阅下文了解为什么我认为这不是一个好方法):

import requests                                                             
import lxml.html                                                            

BASE_URL = "http://www.yelp.com"                                            
search = "house cleaner"                                                    
location ="London, Uk"                                                      
term = search.replace(" ","+")                                              
place = location.replace(",","%2C").replace(" ","+")                        
query = BASE_URL + "/search?find_desc="+term+"&find_loc="+place+"&ns=1#start=0"

html = requests.get(query).content                                          
tree = lxml.html.fromstring(html)
results = tree.xpath("//span[@class='indexed-biz-name']/a[@class='biz-name']/@href")

for result in results:                                                      
    print BASE_URL + result                                                 

如果您进行更多抓取,为什么我对您的代码进行了各种更改的一些指示:

  • 当请求存在时,mechanize 可能有点过于重量级,无法处理像这样的简单任务(scrapy 也是如此),并且是一个非常易于使用的用于发出 HTTP 请求的库
  • 使用 XPath 非常方便提取网页的特定功能。您可以看到这确实简化了查找所需元素的过程。

但是,更一般地说,如果我想从网站中提取信息,我会做的第一件事是检查他们是否有 API

Yelp 可以我建议您使用它。为什么?

  • 这是一种行为契约;您可以依赖其中记录的任何内容。如果有某种退出方式,例如指向业务页面的链接,它应该保持稳定。不能保证抓取他们的网站也是如此:他们网站的布局可能会改变,并且这里的代码很可能会中断。
  • 这是一种获准用于获取信息的方法。如果您拥有有效的 API 密钥,则您发出的 Yelp API 请求的唯一限制是每天 10,000 次调用。另一方面,如果您只是在这里抓取它们,它们可能会阻止您的 IP 地址以阻止它,尤其是在您发出大量自动页面请求的情况下。
于 2014-02-23T11:55:34.153 回答