繁体   English   中英

适用于Yelp的Python中的Web爬网程序

[英]Web Crawler in Python for Yelp

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

为什么要重新发明轮子? 尝试scrapy ,开源并用python编写,完全可以实现您想要的功能。

这是一个爬网网站的示例

这是解决使您的代码执行您想要的事情的字面问题的解决方案(但是请参阅下面的内容,以了解为什么我认为这不是一个好方法):

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可能有点过于繁重,无法处理这样的简单任务(同样容易出错),并且是用于发出HTTP请求的真正易于使用的库
  • 使用XPath对于提取网页的特定功能非常方便。 您可以看到,这确实简化了查找所需元素的过程。

但是,更一般而言,如果我想从站点提取信息,我要做的第一件事就是检查它们是否具有API

是的我建议你用这个 为什么?

  • 这是行为契约 您可以依靠其中记录的任何内容。 如果有某种方法可以退出,例如指向业务页面的链接,它应该保持稳定。 不能保证同样能刮取其网站:其网站的布局可能会更改,并且此处的代码可能会中断。
  • 这是一种可以用来获取信息的批准方法。 如果您具有有效的API密钥,则您发出的Yelp API请求的唯一限制是每天10,000次调用 另一方面,如果您只是按照此处的方式抓取它们,它们可能会阻止您的IP地址以阻止它,尤其是当您发出大量自动页面请求时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM