【发布时间】:2019-05-25 01:32:28
【问题描述】:
我在 python 中编写了一个脚本,使用 代理 来抓取遍历网页不同页面的不同帖子的链接。我尝试使用列表中的proxies。该脚本应该从列表中随机获取proxies 并向该网站发送请求,最后解析这些项目。但是,如果任何proxy 不起作用,则应将其从列表中踢出。
我认为我在ThreadPool(10).starmap(make_requests, zip(proxyVault,lead_url)) 中使用number of proxies 和list 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))
顺便说一句,上面使用的proxies 只是占位符。
【问题讨论】:
标签: python python-3.x web-scraping proxy