我已经使用 代理 用python与硒结合编写了一个脚本,以获取导航到URL时填充的不同链接的文本,如 this one 。我要从那里解析的是连接到每个链接的可见文本。
到目前为止,我尝试过的脚本能够在其中调用此函数start_script()
时产生新的代理。问题在于网址非常引导我进入此redirected link。只有当我继续尝试直到该URL对代理满意时,我才能摆脱这种重定向。我当前的脚本只能用两个新代理尝试两次。
如何在get_texts()
函数中使用任何循环,以便它将继续尝试使用新代理,直到解析所需的内容为止?
到目前为止我的尝试:
import requests
import random
from itertools import cycle
from bs4 import BeautifulSoup
from selenium import webdriver
link = 'http://www.google.com/search?q=python'
def get_proxies():
response = requests.get('https://www.us-proxy.org/')
soup = BeautifulSoup(response.text,"lxml")
proxies = [':'.join([item.select_one("td").text,item.select_one("td:nth-of-type(2)").text]) for item in soup.select("table.table tbody tr") if "yes" in item.text]
return proxies
def start_script():
proxies = get_proxies()
random.shuffle(proxies)
proxy = next(cycle(proxies))
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f'--proxy-server={proxy}')
driver = webdriver.Chrome(chrome_options=chrome_options)
return driver
def get_texts(url):
driver = start_script()
driver.get(url)
if "index?continue" not in driver.current_url:
for item in [items.text for items in driver.find_elements_by_tag_name("h3")]:
print(item)
else:
get_texts(url)
if __name__ == '__main__':
get_texts(link)
答案 0 :(得分:1)
下面的代码对我来说效果很好,但是对于不良代理却无济于事。它还会遍历代理列表,并尝试执行一次,直到成功完成或该列表用完为止。 它会打印使用的代理,以便您可以看到它尝试了多次。
然而https://www.us-proxy.org/指出:
什么是Google代理?支持在Google上进行搜索的代理是 称为Google代理。一些程序需要它们来制作大量 在Google上查询。自2016年以来,所有Google代理均已死亡。 阅读该文章以获取更多信息。
2016年的Google Blocks Proxy Google会显示一个页面来验证您的身份 如果检测到代理,则由人代替机器人。一年之前 2016年,如果您可以通过Google允许使用该代理一段时间 这种人工验证。
from contextlib import contextmanager
import random
from bs4 import BeautifulSoup
import requests
from selenium import webdriver
def get_proxies():
response = requests.get('https://www.us-proxy.org/')
soup = BeautifulSoup(response.text,"lxml")
proxies = [':'.join([item.select_one("td").text,item.select_one("td:nth-of-type(2)").text]) for item in soup.select("table.table tbody tr") if "yes" in item.text]
random.shuffle(proxies)
return proxies
# Only need to fetch the proxies once
PROXIES = get_proxies()
@contextmanager
def proxy_driver():
try:
proxy = PROXIES.pop()
print(f'Running with proxy {proxy}')
chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument("--headless")
chrome_options.add_argument(f'--proxy-server={proxy}')
driver = webdriver.Chrome(options=chrome_options)
yield driver
finally:
driver.close()
def get_texts(url):
with proxy_driver() as driver:
driver.get(url)
if "index?continue" not in driver.current_url:
return [items.text for items in driver.find_elements_by_tag_name("h3")]
print('recaptcha')
if __name__ == '__main__':
link = 'http://www.google.com/search?q=python'
while True:
links = get_texts(link)
if links:
break
print(links)
答案 1 :(得分:0)
while True:
driver = start_script()
driver.get(url)
if "index?continue" in driver.current_url:
continue
else:
break
这将循环直到index?continue
不在URL中,然后break
退出循环。
此答案仅解决您的特定问题-并未解决您可能会创建大量Web驱动程序的问题,但是您绝不会销毁未使用/失败的驱动程序。提示:应该。