各位程序员好:)
因此,作为我的研究项目的一部分,我需要从网站上抓取数据。显然,它会检测机器人,因此我尝试在一个循环上实现代理,我知道这个循环是有效的(获取品牌url):
工作循环:
brands_links= []
for country_link in country_links:
r = requests.get(url + country_link, headers=headers)
soup_b = BeautifulSoup(r.text, "lxml")
for link in soup_b.find_all("div", class_='designerlist cell small-6 large-4'):
for link in link.find_all('a'):
durl = link.get('href')
brands_links.append(durl)使用代理的循环:
brands_links= []
i = 0
while i in range(0, len(country_links)):
print(i)
try:
proxy_index = random.randint(0, len(proxies) - 1)
proxy = {"http": proxies[proxy_index], "https": proxies[proxy_index]}
r = requests.get(url + country_links[i], headers=headers, proxies=proxy, timeout=10)
soup_b = BeautifulSoup(r.text, "lxml")
for link in soup_b.find_all("div", class_='designerlist cell small-6 large-4'):
for link in link.find_all('a'):
durl = link.get('href')
brands_links.append(durl)
if durl is not None :
print("scraping happening")
i += 1
else:
continue
except:
print("proxy not working")
proxies.remove(proxies[proxy_index])
if i == len(country_links):
break
else:
continue不幸的是,它并没有刮掉所有的链接。
在只使用头部的工作循环中,我得到了一个长度为3788的列表。用这个我只能得到2387。
通过检查数据,我可以看到它跳过了一些国家/地区的链接,因此出现了长度上的差异。我试图用"if“语句强制循环抓取所有链接,但似乎不起作用。
有没有人知道我做错了什么,或者有什么想法可以让它变得一无是处?感谢预付款
发布于 2020-08-08 20:29:23
感谢您分享此链接。
你说过:
显然它可以检测到机器人,所以我正在尝试实现代理...
你怎么会这么想呢?下面是我想出来的一些代码,据我所知,这些代码似乎包含了所有的div:
def main():
import requests
from bs4 import BeautifulSoup
countries = (
("United States", "United+States.html"),
("Canada", "Canada.html"),
("United Kingdom", "United+Kingdom.html")
)
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
}
for country, document in countries:
url = f"https://www.fragrantica.com/country/{document}"
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
divs = soup.find_all("div", {"class": "designerlist"})
print(f"Number of divs in {country}: {len(divs)}")
return 0
if __name__ == "__main__":
import sys
sys.exit(main())输出:
Number of divs in United States: 1016
Number of divs in Canada: 40
Number of divs in United Kingdom: 308
>>> 发布于 2020-08-09 17:44:10
所以我找到了一种方法,让循环保持抓取,直到它真正抓取链接。下面是更新后的代码:
brands_links= []
i = 0
while i in range(0, len(country_links)):
print(i)
try:
proxy_index = random.randint(0, len(proxies) - 1)
proxy = {"http": proxies[proxy_index], "https": proxies[proxy_index]}
r = requests.get(url + country_links[i], headers=headers, proxies=proxy, timeout=10)
soup_b = BeautifulSoup(r.text, "lxml")
for link in soup_b.find_all("div", class_='designerlist cell small-6 large-4'):
for link in link.find_all('a'):
durl = link.get('href')
brands_links.append(durl)
except:
print("proxy not working")
proxies.remove(proxies[proxy_index])
continue
try :
durl
except NameError:
print("scraping not happening")
continue
else:
print("scraping happening")
del durl
i += 1
if i == len(country_links):
break
else:
continue所以它是最后一条if语句,用来检查链接是否确实被刮掉了。
我对函数不是很熟悉。因此,如果有人能让它变得更简单或更高效,我将不胜感激。至于现在,我将使用@Paul M函数来改进我的循环或将其转换为函数。
https://stackoverflow.com/questions/63314744
复制相似问题