Python:如何实现并行化处理

2024-09-26 17:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将任务划分为8个进程。 我用multiprocessing来做这个。 我试着描述我的任务: 我有dataframe和url列。有些url有一个验证码,我尝试使用其他文件的代理从每个url获取页面。 这需要很多时间,我想把它分开。我想用一个代理打开第一个url,用另一个代理打开第二个url等等。我不能用mapzip,因为用代理的列表长度较小。 URL看起来像

['https://www.avito.ru/moskva/avtomobili/bmw_x5_2016_840834845', 'https://www.avito.ru/moskva/avtomobili/bmw_1_seriya_2016_855898883', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_853351780', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641142', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641140', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_853351780', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641134', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641141']

代理看起来像

['http://203.223.143.51:8080', 'http://77.123.18.56:81', 'http://203.146.189.61:80', 'http://113.185.19.130:80', 'http://212.235.226.133:3128', 'http://5.39.89.84:8080']

我的代码:

def get_page(url):
m = re.search(r'avito.ru\/[a-z]+\/avtomobili\/[a-z0-9_]+$', url)
if m is not None:
    url = 'https://www.' + url
    print url
    proxy = pd.read_excel('proxies.xlsx')
    proxies = proxy.proxy.values.tolist()
    for i, proxy in enumerate(proxies):
        print "Trying HTTP proxy %s" % proxy
        try:
            result = urllib.urlopen(url, proxies={'http': proxy}).read()
            if 'Мы обнаружили, что запросы, поступающие с вашего IP-адреса, похожи на автоматические' in result:
                raise Exception
            else:
                page = page.read()
                soup = BeautifulSoup(page, 'html.parser')
                price = soup.find('span', itemprop="price")
                print price
        except:
            print "Trying next proxy %s in 10 seconds" % proxy
            time.sleep(10)

if __name__ == '__main__':
    pool = Pool(processes=8)
    pool.map(get_page, urls)

我的代码需要8个网址,并尝试用一个代理打开它。如何更改算法以打开8个URL和8个不同的代理


Tags: httpshttpurl代理wwwrupageproxy
1条回答
网友
1楼 · 发布于 2024-09-26 17:53:22

这样做或许会有帮助:

def get_page(url):
m = re.search(r'avito.ru\/[a-z]+\/avtomobili\/[a-z0-9_]+$', url)
if m is not None:
    url = 'https://www.' + url
    print url
    proxy = pd.read_excel('proxies.xlsx')
    proxies = proxy.proxy.values.tolist()
    for i, proxy in enumerate(proxies):
        thread.start_new_thread( run, (proxy,i ) )

def run(proxy,i):
    print "Trying HTTP proxy %s" % proxy
    try:
        result = urllib.urlopen(url, proxies={'http': proxy}).read()
        if 'Мы обнаружили, что запросы, поступающие с вашего IP-адреса, похожи на автоматические' in result:
                raise Exception
        else:
            page = page.read()
            soup = BeautifulSoup(page, 'html.parser')
            price = soup.find('span', itemprop="price")
            print price
    except:
        print "Trying next proxy %s in 10 seconds" % proxy
            time.sleep(10)

if __name__ == '__main__':
    pool = Pool(processes=8)
    pool.map(get_page, urls)

相关问题 更多 >

    热门问题