zoukankan      html  css  js  c++  java
  • Python使用浏览器模拟访问页面之使用ip代理

    最近需要使用浏览器模拟访问页面,同时需要使用不同的ip访问,这个时候就考虑到在使用浏览器的同时加上ip代理。

    本篇工作环境为win10,python3.6.

    Chorme

    使用Chrome浏览器模拟访问,代码如下

    import time
    from selenium import webdriver
    
    url = "https://www.cnblogs.com/"
    driver = webdriver.Chrome("D:/tools/wedriver/chromedriver.exe")
    driver.get(url)
    time.sleep(2)
    print(driver.title)
    driver.close()

    “D:/tools/wedriver/chromedriver.exe” 是下载的谷歌浏览器驱动,下载地址http://npm.taobao.org/mirrors/chromedriver/

    chorme使用ip代理比较简单,使用如下代码即可

    import time
    from selenium import webdriver
    
    url = "https://www.baidu.com/s?wd=ip"
    proxy = "118.190.217.182:80"
    chromeOptions = webdriver.ChromeOptions()  # 设置代理
    chromeOptions.add_argument("--proxy-server=http://%s" % proxy)
    driver = webdriver.Chrome("D:/tools/wedriver/chromedriver.exe", chrome_options=chromeOptions)
    driver.get(url)
    time.sleep(2)
    print(driver.title)
    driver.close()

    得到的效果如下图:

    可以见到百度查询到的本机ip已经改变。Chrome的这种代理方式中,访问使用http、https的网站都代理了。

    Firefox

    使用Firefox访问网页,代码如下:

    import time
    from selenium import webdriver
    
    
    url = "https://www.cnblogs.com/"
    driver = webdriver.Firefox()
    driver.get(url)
    time.sleep(2)
    print(driver.title)
    driver.close()

    直接这样运行会遇到以下错误:

    selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH. 

    需要装geckodriver,下载地址https://github.com/mozilla/geckodriver/releases。使用方式为,将对应版本geckodriver.exe放到python.exe的同目录下。

    装好之后再次运行即可访问网站。

    Firefox的ip代理较为麻烦,需要设置一些参数,具体如下

    import time
    from selenium import webdriver
    
    
    url = "https://www.baidu.com/s?wd=ip"
    proxy = "118.190.217.182:80"
    ip, port = proxy.split(':')
    profile = webdriver.FirefoxProfile()
    profile.set_preference('network.proxy.type', 1)
    profile.set_preference('network.proxy.http', ip)    # 设置http代理
    profile.set_preference('network.proxy.http_port', int(port))  # 注意端口一定要使用数字而非字符串
    profile.set_preference('network.proxy.ssl', ip)     # 设置https代理
    profile.set_preference('network.proxy.ssl_port', int(port))
    profile.update_preferences()
    driver = webdriver.Firefox(profile)
    driver.get(url)
    time.sleep(2)
    print(driver.title)
    driver.close()

    这里有两个注意点:

      1.当需要访问的网站为https时,一定要设置network.proxy.ssl参数才行

      2.协议的端口号一定要是整数,不能直接使用字符串,如果拿到的是字符串就使用int转一下;我之前就是使用了字符串,一直代理不生效,以为哪里出了问题,磨了半天。。。

    运行以上代码之后,得到的页面和上一张图相同,这里不再贴图。

    整体代码如下:

    # encoding=utf-8
    # date: 2018/9/14
    __Author__ = "Masako"
    
    import time
    from selenium import webdriver
    
    
    def visit_web(url, proxy):
        # chrome
        # chromeOptions = webdriver.ChromeOptions() # 设置代理
        # chromeOptions.add_argument("--proxy-server=http://%s" % proxy)
        # driver = webdriver.Chrome("D:/tools/wedriver/chromedriver.exe", chrome_options=chromeOptions)
    
        # firefox
        ip, port = proxy.split(':')
        profile = webdriver.FirefoxProfile()
        profile.set_preference('network.proxy.type', 1)
        profile.set_preference('network.proxy.http', ip)
        profile.set_preference('network.proxy.http_port', int(port))  # 注意端口一定要使用数字而非字符串
        profile.set_preference('network.proxy.ssl', ip)
        profile.set_preference('network.proxy.ssl_port', int(port))
        profile.set_preference("network.proxy.share_proxy_settings", True)
        profile.update_preferences()
        driver = webdriver.Firefox(profile)
    
        driver.get(url)
        time.sleep(2)
        print(driver.title)
        driver.delete_all_cookies()  # 清除cookies
        driver.close()
        driver.quit()
    
    
    if __name__ == "__main__":
        url = "https://www.baidu.com/s?wd=ip"
        proxy = "118.190.217.182:80"
        visit_web(url, proxy)
    View Code
  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/masako/p/9647080.html
Copyright © 2011-2022 走看看