python - Yelp 的 Python 网络爬虫

标签 python beautifulsoup web-crawler mechanize-python

我一直在尝试为 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

最佳答案

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

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                                                 

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

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

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

Yelp does ,并且我建议您使用它。为什么?

  • 这是一种行为契约;您可以依赖其中记录的任何内容。如果有某种方法可以退出,例如链接到业务页面,它应该保持稳定。抓取他们的网站也不能保证:他们网站的布局可能会改变,这里的代码很可能会崩溃。
  • 这是一种允许您用来获取信息的方法。如果您拥有有效的 API key ,您对 Yelp API 请求的唯一限制是 10,000 calls per day .另一方面,如果您只是像这里那样抓取它们,它们可能会阻止您的 IP 地址以阻止它,尤其是当您发出大量自动页面请求时。

关于python - Yelp 的 Python 网络爬虫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21962537/

相关文章:

python - 按 20 秒间隔对时间戳进行分组

python - 使用 scrapy spider 抓取 http 状态码

python - 如何使用 bs4 打印第一个 google 搜索结果链接?

python - BeautifulSoup 返回不正确的文本

java - 抓取 URL 以提取该页面中的所有其他 URL

c++ - 非常简单的 C++ 网络爬虫/蜘蛛?

python - 索引与在另一个列表中使用一个列表索引不同步

python - openpyxl 组列,其中 "Summary Columns to the Right of Detail"未选中

python - BeautifulSoup 连接单词

python - 如何使用 Scrapy/Python 从条件下拉字段中获取值?