Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法将代理和链接传递到线程池以获取结果_Python_Python 3.x_Web Scraping_Proxy - Fatal编程技术网

Python 无法将代理和链接传递到线程池以获取结果

Python 无法将代理和链接传递到线程池以获取结果,python,python-3.x,web-scraping,proxy,Python,Python 3.x,Web Scraping,Proxy,我已经用python编写了一个脚本,使用代理来抓取遍历网页不同页面的不同帖子的链接。我尝试使用列表中的代理。脚本应该从列表中随机获取代理,并向该网站发送请求,最后解析项目。但是,如果任何代理不起作用,则应将其从列表中剔除 我认为我在ThreadPool(10)中使用代理数量和url列表的方式。starmap(make_requests,zip(proxyVault,lead_url))是准确的,但不会产生任何结果;相反,脚本被卡住了 如何将代理和链接传递到线程池,以便脚本生成结果? 顺便说一句,

我已经用python编写了一个脚本,使用代理来抓取遍历网页不同页面的不同帖子的链接。我尝试使用列表中的
代理。脚本应该从列表中随机获取
代理
,并向该网站发送请求,最后解析项目。但是,如果任何
代理
不起作用,则应将其从列表中剔除

我认为我在
ThreadPool(10)中使用
代理数量
url列表
的方式。starmap(make_requests,zip(proxyVault,lead_url))
是准确的,但不会产生任何结果;相反,脚本被卡住了

如何将代理和链接传递到线程池,以便脚本生成结果?


顺便说一句,上面使用的
代理
只是占位符。

也许您可以使用另一种方法来获取这样的代理

def get_proxy():                                                                                                                                                                                  
    url = 'https://free-proxy-list.net/anonymous-proxy.html'                                                                                                                                      
    response = requests.get(url)                                                                                                                                                                  
    soup = BeautifulSoup(response.text, 'lxml')                                                                                                                                                   
    table = soup.find('table', attrs={'id': 'proxylisttable'})                                                                                                                                    
    table_body = table.find('tbody')                                                                                                                                                              
    proxies = table_body.find_all('tr')                                                                                                                                                           
    proxy_row = random.choice(proxies).find_all('td')                                                                                                                                             
    return proxy_row[0].text + ':' + proxy_row[1].text  

代码的问题在于它在线程中创建了很多无止境的循环。另外,他们处理代理的方式对我来说有点奇怪,所以我改变了。 我还认为您误解了数据是如何发送到线程的,它们只得到了iterable的一个元素,而不是全部。所以我改了一些名字来反映这一点

它现在的工作方式是,每个线程从lead_url获取自己的url,然后从proxyVault中随机选择一个代理。 他们获取网页并对其进行解析,然后在每个解析的链接上调用get_title

如果请求因代理而失败,则该代理将从列表中删除,以便不再使用,并再次调用make_请求,这将从仍然可用的代理中随机选择一个新代理。 我没有改变实际的解析,因为我无法判断它是否是您想要的

可运行代码:


我的问题不是关于获得代理;而是以正确的方式使用它们@user1330614。这是迄今为止我遇到的最好的脚本@SimonF。唯一的问题是,您的脚本一直在运行,并生成重复的脚本,因为它无法在需要时跳出循环。然而,这仍然是我经历中最好的一次。我希望你能弥补这个缺点。谢谢。@robots.txt您能举一个复制品的例子吗?解析页面的逻辑是你的,我没有改变。打印完所有已抓取的标题后,脚本将停止,但这需要一些时间,因为您首先有一个链接请求,然后是每个标题的另一个请求。运行完成后,我将向您显示结果。再次感谢一万亿@SimonF.Hi@SimonF,请看一下,如果你能做些什么来解决这个问题。提前谢谢。
def get_proxy():                                                                                                                                                                                  
    url = 'https://free-proxy-list.net/anonymous-proxy.html'                                                                                                                                      
    response = requests.get(url)                                                                                                                                                                  
    soup = BeautifulSoup(response.text, 'lxml')                                                                                                                                                   
    table = soup.find('table', attrs={'id': 'proxylisttable'})                                                                                                                                    
    table_body = table.find('tbody')                                                                                                                                                              
    proxies = table_body.find_all('tr')                                                                                                                                                           
    proxy_row = random.choice(proxies).find_all('td')                                                                                                                                             
    return proxy_row[0].text + ':' + proxy_row[1].text  
from bs4 import BeautifulSoup
from multiprocessing.pool import ThreadPool
from random import choice
import requests
from urllib.parse import urljoin

base_url = 'https://stackoverflow.com/questions/tagged/web-scraping'
lead_url = [f'https://stackoverflow.com/questions/tagged/web-scraping?sort='
            f'newest&page={page}&pagesize=15' for page in range(1, 6)]

proxyVault = ['36.67.57.45:53367', '5.202.150.233:42895',
              '85.187.184.129:8080', '109.195.23.223:45947']

def make_requests(url):
    proxy_url = choice(proxyVault)
    proxy = {'https': f'http://{proxy_url}'}
    try:
        res = requests.get(url, proxies=proxy)
        soup = BeautifulSoup(res.text, "lxml")
        [get_title(proxy, urljoin(base_url, item.get("href")))
         for item in soup.select(".summary .question-hyperlink")]
    except requests.exceptions.ProxyError:
        # Check so that the bad proxy was not removed by another thread
        if proxy_url in proxyVault:
            proxyVault.remove(proxy_url)
            print(f'Removed bad proxy: {proxy_url}')
        return make_requests(url)

def get_title(proxy, itemlink):
    res = requests.get(itemlink, proxies=proxy)
    soup = BeautifulSoup(res.text, "lxml")
    print(soup.select_one("h1[itemprop='name'] a").text)

if __name__ == '__main__':
    ThreadPool(10).map(make_requests, lead_url)