2016-08-14 26 views
0

我目前正在編寫此代碼以從他們的Yelp頁面中獲取餐館的官方網站鏈接。代碼主要工作,但它返回第一個鏈接兩次,而不是通過列表並返回每個項目一次。我試圖解決這個問題,但我只是停留在導致這種情況發生的原因上。你能發現我做錯了什麼嗎?Python 3.5刮板只運行列表中的第一個網站

我還有一個關於抓取Yelp鏈接的問題。我知道Yelp可能不喜歡它,但我真的無法手工複製和粘貼20,000頁的鏈接,所以我必須使用它。

他們會阻止我的IP嗎?在請求之間插入2秒延遲會阻止他們阻止我嗎?除插入延遲之外是否還有其他方法?

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

url=[ 
"https://www.yelp.com/biz/buffalo-wild-wings-ann-arbor-3", 
"https://www.yelp.com/biz/good-burger-east-dearborn-dearborn?osq=mac+donalds" 
] 

def make_soup(url): 
    for i in url: 
     thepage=urllib.request.urlopen(i) 
     soupdata=BeautifulSoup(thepage, "html.parser") 
     return soupdata 

compoundfinal='' 
soup=make_soup(url) 

for i in url: 
    for thing1 in soup.findAll('div',{'class':'mapbox-text'}): 
     for thing2 in thing1.findAll('a',{'rel':'nofollow'}): 
      final='"http://www.'+thing2.text+'",\n' 
      compoundfinal=compoundfinal+final 

print(compoundfinal) 

回答

0

您試圖在兩個不同的循環之間拆分處理,但未正確保存數據,然後在兩者之間重新進行迭代。您還看起來像在函數定義中的return語句中有錯誤的縮進,所以該函數在第一次迭代後返回,而不管列表中的項目數。以下似乎將所有處理放在一個函數中。這是從您的示例中獲取工作代碼的最佳方式,但它不是解決問題的最佳方法。你最好定義你的函數來處理一個頁面,然後遍歷url來調用函數。

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

url=[ 
"https://www.yelp.com/biz/buffalo-wild-wings-ann-arbor-3", 
"https://www.yelp.com/biz/good-burger-east-dearborn-dearborn?osq=mac+donalds" 
] 

def make_soup(url): 
    compoundfinal = "" 
    for i in url: 
     thepage=urllib.request.urlopen(i) 
     soupdata=BeautifulSoup(thepage, "html.parser") 
     for thing1 in soupdata.findAll('div',{'class':'mapbox-text'}): 
      for thing2 in thing1.findAll('a',{'rel':'nofollow'}): 
       final='"http://www.'+thing2.text+'",\n' 
       compoundfinal=compoundfinal+final 
    return compoundfinal 


final = make_soup(url) 

print(final) 

輸出

"http://www.buffalowildwings.com", 
"http://www.goodburgerrestaurant.com" 
+0

非常感謝!你不僅幫我解決了這個問題,還從這篇文章中學到了很多東西。 – James

1

爲輔助問題的答案:

是,把擦傷之間的延遲將是一個非常不錯的主意。我想說靜態的2秒延遲可能是不夠的 - 也許會考慮2到5之間的隨機延遲。這將使得這些擦傷看起來不那麼確定,儘管您仍然可能每小時被擦傷。這是值得寫出你的腳本,以便你可以重新啓動它,以防中間出現問題 - 你不想從頭開始重新開始。

也請download Yell's Robots Exclusion File並檢查你的刮臉清單對他們沒有刮的清單。我注意到他們要求Bing有10秒的延遲,因此請考慮增加我上面提出的延遲。

您可能還想考慮這方面的法律問題。大多數網站想要被刮掉,所以他們可以出現在搜索引擎中。然而,一些數據整合者可能並不具有相同的熱情:他們可能希望被搜索引擎發現,但他們不希望被競爭對手所取代。請記住,首先收集數據會花費很多錢,而且他們可能會反對第三方免費搭車。因此,如果您計劃定期更新自己的網站,我認爲您可能遇到技術或法律方面的障礙。

您可能會試圖使用代理來隱藏抓取流量,但這帶有隱含的信息,您認爲您做錯了什麼。在這種情況下,您的刮目標可能會做出更多努力來阻止您,並且如果他們找到您要重新發布數據的網站,可能會對您採取法律行動。

+0

感謝您提供詳細的迴應,概述兩個可能的問題,並仍然提供解決方案。在繼續之前,我將探索Yell的機器人排除文件。 – James

+0

不用擔心@詹姆斯,祝你好運! – halfer

+0

**您同意不會,也不會協助,鼓勵或讓其他人:** *使用任何機器人,蜘蛛,網站搜索/檢索應用程序或其他自動化設備,流程或手段訪問,檢索,刮擦,或索引網站的任何部分或任何網站內容; *限制第6節iii。 https://www.yelp.com/static?country=US&p=tos。有一個python api https://github.com/Yelp/yelp-python –