首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用proxies一切抓取循环

使用proxies一切抓取循环
EN

Stack Overflow用户
提问于 2020-08-08 19:15:38
回答 2查看 74关注 0票数 1

各位程序员好:)

因此,作为我的研究项目的一部分,我需要从网站上抓取数据。显然,它会检测机器人,因此我尝试在一个循环上实现代理,我知道这个循环是有效的(获取品牌url):

工作循环:

代码语言:javascript
复制
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)

使用代理的循环:

代码语言:javascript
复制
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“语句强制循环抓取所有链接,但似乎不起作用。

有没有人知道我做错了什么,或者有什么想法可以让它变得一无是处?感谢预付款

EN

回答 2

Stack Overflow用户

发布于 2020-08-08 20:29:23

感谢您分享此链接。

你说过:

显然它可以检测到机器人,所以我正在尝试实现代理...

你怎么会这么想呢?下面是我想出来的一些代码,据我所知,这些代码似乎包含了所有的div:

代码语言:javascript
复制
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())

输出:

代码语言:javascript
复制
Number of divs in United States: 1016
Number of divs in Canada: 40
Number of divs in United Kingdom: 308
>>> 
票数 1
EN

Stack Overflow用户

发布于 2020-08-09 17:44:10

所以我找到了一种方法,让循环保持抓取,直到它真正抓取链接。下面是更新后的代码:

代码语言:javascript
复制
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函数来改进我的循环或将其转换为函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63314744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档