【发布时间】:2019-01-11 10:21:22
【问题描述】:
我在 python 中编写了一个脚本,使用代理从网页中抓取遍历不同页面的不同帖子的链接。 My goal here is to make two subsequesnt requests using different proxies from a list。
脚本从列表中获取随机代理并通过make_requests() 函数发送请求,然后通过使用make_ano_requests() 函数新填充的链接从列表中选择另一个代理再次发出另一个请求。
最后,get_title() 函数打印结果。
但是,如果任何代理不起作用,则它会被 make_requests() 或 make_ano_requests() 两个函数中的任何一个从列表中踢出。
当我运行脚本时,它似乎在工作,但在它执行的某个地方,脚本卡住了,永远不会完成任务。我怎样才能完成任务?
这是我到目前为止所写的(proxyVault 包含虚假代理):
import random
import requests
from random import choice
from bs4 import BeautifulSoup
from urllib.parse import urljoin
base_url = 'https://stackoverflow.com/questions/tagged/web-scraping'
lead_urls = [f'https://stackoverflow.com/questions/tagged/web-scraping?sort='
f'newest&page={page}&pagesize=50' for page in range(1, 5)]
linkList = []
proxyVault = ['103.110.37.244:36022', '180.254.218.229:8080', '110.74.197.207:50632', '1.20.101.95:49001', '200.10.193.90:8080', '173.164.26.117:3128', '103.228.118.66:43002', '178.128.231.201:3128', '1.2.169.54:55312', '181.52.85.249:31487', '97.64.135.4:8080', '190.96.214.123:53251', '52.144.107.142:31923', '45.5.224.145:52035', '89.218.22.178:8080', '192.241.143.186:80', '113.53.29.218:38310', '36.78.131.182:39243']
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")
linkList.extend([urljoin(base_url, item.get("href")) for item in soup.select(".summary .question-hyperlink")])
except requests.exceptions.ProxyError:
if proxy_url in proxyVault:
proxyVault.remove(proxy_url)
print(f'kicked out bad proxy by first func: {proxy_url}')
return make_requests(url)
def make_ano_requests(url):
proxy_url = choice(proxyVault)
proxy = {'https': f'http://{proxy_url}'}
try:
res = requests.get(url, proxies=proxy)
get_title(res.text)
except requests.exceptions.ProxyError:
if proxy_url in proxyVault:
proxyVault.remove(proxy_url)
print(f'kicked out bad proxy by second func: {proxy_url}')
return make_ano_requests(url)
def get_title(response):
soup = BeautifulSoup(response, "lxml")
print(soup.select_one("h1[itemprop='name'] a").text)
if __name__ == '__main__':
for lead_url in lead_urls:
make_requests(lead_url)
for single_link in linkList:
make_ano_requests(single_link)
【问题讨论】:
-
该代码似乎可以工作,但所有请求都非常慢(即使删除了代理)。补充说,您通过可能非常慢的代理会给人一种冻结的印象。尝试打印不同的阶段以了解我的意思
标签: python python-3.x web-scraping proxy