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

时间:2016-08-14 01:40:22

标签: python-3.x

我目前正在编写此代码,以便从Yelp网页上获取餐馆的官方网站链接。代码主要工作,但它返回第一个链接两次而不是遍历列表并返回每个项目一次。我试图解决它,但我只是坚持导致这种情况发生的原因。你能发现我做错了吗?

我还有一个关于从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)  

2 个答案:

答案 0 :(得分:1)

您的第二个问题的答案:

是的,在刮擦之间加上延迟是一个非常好的主意。我会说静态的2秒延迟可能还不够 - 考虑一下2到5之间的随机延迟,这可能会使得刮擦看起来不那么确定,尽管你可能仍然会根据每小时的刮擦被捕获。编写脚本是值得的,这样你就可以重新启动它,以防万一中间出现问题 - 你不想从一开始就重新开始。

请同时download Yell's Robots Exclusion File并根据他们的禁止清单检查您的抓取清单。我注意到他们要求Bing延迟10秒,所以考虑增加我上面建议的延迟。

您可能还想考虑这方面的法律方面。大多数网站想要被删除,因此它们可以出现在搜索引擎中。然而,一些数据聚合器可能没有相同的热情:他们可能希望被搜索引擎找到,但他们不希望被竞争对手取代。请记住,首先收集数据需要花费很多钱,他们可能会反对第三方搭便车。因此,如果您计划定期执行此操作以更新您自己的网站,我认为您可能遇到技术或法律障碍。

您可能很想使用代理来隐藏您的抓取流量,但这带有一条隐含的消息,您认为自己做错了。在这种情况下,你的掠夺目标可能会更加努力阻止你,如果他们找到你要重新发布数据的网站,你可能更有可能对你采取法律行动。

答案 1 :(得分: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"