无法使我的脚本使用代理获取所需的内容

时间:2018-12-30 20:18:12

标签: python python-3.x selenium selenium-webdriver web-scraping

我已经使用 代理 用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)

2 个答案:

答案 0 :(得分:1)

下面的代码对我来说效果很好,但是对于不良代理却无济于事。它还会遍历代理列表,并尝试执行一次,直到成功完成或该列表用完为止。 它会打印使用的代理,以便您可以看到它尝试了多次。

然而https://www.us-proxy.org/指出:

  

什么是Google代理?支持在Google上进行搜索的代理是   称为Google代理。一些程序需要它们来制作大量   在Google上查询。自2016年以来,所有Google代理均已死亡。   阅读该文章以获取更多信息。

Article:

  

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驱动程序的问题,但是您绝不会销毁未使用/失败的驱动程序。提示:应该。