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"
为辅助问题的答案:
是,把擦伤之间的延迟将是一个非常不错的主意。我想说静态的2秒延迟可能是不够的 - 也许会考虑2到5之间的随机延迟。这将使得这些擦伤看起来不那么确定,尽管您仍然可能每小时被擦伤。这是值得写出你的脚本,以便你可以重新启动它,以防中间出现问题 - 你不想从头开始重新开始。
也请download Yell's Robots Exclusion File并检查你的刮脸清单对他们没有刮的清单。我注意到他们要求Bing有10秒的延迟,因此请考虑增加我上面提出的延迟。
您可能还想考虑这方面的法律问题。大多数网站想要被刮掉,所以他们可以出现在搜索引擎中。然而,一些数据整合者可能并不具有相同的热情:他们可能希望被搜索引擎发现,但他们不希望被竞争对手所取代。请记住,首先收集数据会花费很多钱,而且他们可能会反对第三方免费搭车。因此,如果您计划定期更新自己的网站,我认为您可能遇到技术或法律方面的障碍。
您可能会试图使用代理来隐藏抓取流量,但这带有隐含的信息,您认为您做错了什么。在这种情况下,您的刮目标可能会做出更多努力来阻止您,并且如果他们找到您要重新发布数据的网站,可能会对您采取法律行动。
非常感谢!你不仅帮我解决了这个问题,还从这篇文章中学到了很多东西。 – James