Python 3.5刮板只运行列表中的第一个网站

问题描述:

我目前正在编写此代码以从他们的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) 

您试图在两个不同的循环之间拆分处理,但未正确保存数据,然后在两者之间重新进行迭代。您还看起来像在函数定义中的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

为辅助问题的答案:

是,把擦伤之间的延迟将是一个非常不错的主意。我想说静态的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 –