gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:05:09 27 4
gpt4 key购买 nike

我使用 proxies 在 python 中编写了一个脚本,以抓取遍历网页不同页面的不同帖子的链接。我尝试使用列表中的 proxies。该脚本应该从列表中随机获取 proxies 并将请求发送到该网站,最后解析这些项​​目。但是,如果任何 proxy 不工作,那么它应该被从列表中踢出。

我认为我在 ThreadPool(10).starmap(make_requests, zip(proxyVault,lead_url) 中使用 number of proxieslist of urls )) 是准确的,但不会产生任何结果;相反,脚本会卡住。

如何将代理和链接传递到 ThreadPool 以便脚本产生结果?

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from multiprocessing.pool import ThreadPool
from itertools import cycle
import random

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

proxyVault = ['104.248.159.145:8888', '113.53.83.252:54356', '206.189.236.200:80', '218.48.229.173:808', '119.15.90.38:60622', '186.250.176.156:42575']

def make_requests(proxyVault,lead_url):
while True:
random.shuffle(proxyVault)
global pitem
pitem = cycle(proxyVault)
proxy = {'https':'http://{}'.format(next(pitem))}
try:
res = requests.get(lead_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 Exception:
try:
proxyVault.pop(0)
make_requests(proxyVault,lead_url)
except Exception:pass

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).starmap(make_requests, zip(proxyVault,lead_url))

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

最佳答案

您的代码的问题是它在线程中创建了很多无限循环。他们处理代理的方式对我来说有点奇怪,所以我改变了它。我还认为您误解了数据是如何发送到线程的,它们得到了可迭代对象的一个​​元素,而不是整个元素。所以我更改了一些名称以反射(reflect)这一点。

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

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

可运行代码:

https://repl.it/@zlim00/unable-to-pass-proxies-and-links-to-the-threadpool-to-get-re

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)

关于python - 无法将代理和链接传递到线程池以获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53937949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com