簡體   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