在编写爬虫过程中,如果一个ip长期大量的访问某一网站,不可避免的会存在ip被ban的情况,所以需要使用到代理ip。
所以就买了一个专门给爬虫使用的代理ip,获取代理ip需要请求头中带有一个认证token,如果使用requests来爬取的话比较简单,直接在headers参数中加入这个自定义请求头即可。
但是有一些网站使用requests爬取并不是很方便,需要用到selenium来爬取,但是原生的selenium支持的请求头设置有限,并不支持自定义请求头。
尝试了很多方法来添加这个认证token,网上找到一些方法,有使用代理页面来发送的,还有使用phantomjs的等等,看了下这些方法不是太繁琐就是通用性不强,phantomjs甚至都停止维护了。
后面找到一篇帖子,是使用自己编写的chrome插件来解决代理认证问题,由于需要花点儿时间去学习如何编写chrome插件,所以没有尝试,但是这个方法启发了我,想到有没有插件是可以自定义请求头的,于是找了下,还真找到这么一个插件,叫ModHeaders,chrome应用商店就可以安装。
查了下这个插件,在这个项目的github页面上发现官方居然提供了API来修改自定义请求头,详情可以参考https://github.com/bewisse/modheader_selenium。
使用方法类似 https://webdriver.bewisse.com/add?{name1}={value1}&{name2}={value2}&...
但是试用了下发现这个API接口已经没法访问了,不知道官方是否还在维护。把api中的webdriver去掉,API可以访问了,但是却一直提示我没有安装ModHeader for Selenium插件。我浏览器中是安装有通用版ModHeaders插件的,但是没有安装selenium专用版,因为我发现官方范例是基于selenium for nodejs的,而我使用的selennium是基于python的,而且我就算手动下载了这个ModHeader for Selenium插件的crx文件,安装时还是提示我文件损坏,所以放弃了使用官方API来修改请求头的方式。
于是尝试使用另外一种方式,简单分析一下我们就会发现,其实这个Modheaders插件的配置页面本质上也是一个html页面,所以我们直接使用selenium来操作这个页面即可。
代码如下:
# =============================================================================
# 只贴了部分关键代码
# =============================================================================
import sys
sys.path.append(r"C:\code\Python")
import getproxy #getproxy是我自己封装的方法,用于获取代理ip供应商的认证token值,不用关注
from selenium import webdriver
import time as t
auth =getproxy.proxyauth() #获取认证token的值,这个不用关注
proxydomain = 'xxx.xxx.xxx' #这里隐藏了代理ip的获取地址
chromeOptions = webdriver.ChromeOptions()
# 加载ModHeaders扩展
extension_path = r'C:\Users\Administrator\Desktop\ModHeader v3.1.25.crx'
chromeOptions.add_extension(extension_path)
# 启动浏览器,并设置好wait
#=================================================================================#
# 重点关注这部分代码即可
#=================================================================================#
# 设置代理
chromeOptions.add_argument("--proxy-server=http://" + proxydomain)
browser = webdriver.Chrome(options=chromeOptions)
t.sleep(1)
# 使用selenium来操作ModHeaders插件,并设置自定义header
extension_id = "idgpnmonknjnojddfkpgkljpfnnfcklj"
modheader ="chrome-extension://"+extension_id+"/popup.html" #获取设置页面
browser.get(modheader)
elem = browser.find_element_by_xpath("//input[@placeholder='Name']")
elem1 = browser.find_element_by_xpath("//input[@placeholder='Value']")
elem.send_keys("Proxy-Authorization")
elem1.send_keys(auth)
t.sleep(2)
# 查看本机ip,查看代理是否起作用
browser.get("http://httpbin.org/ip") #这个是一个可以获取本机ip的网站,用于查看ip后与自己原先的ip进行对比,以确认代理是否生效了。
print(browser.page_source)
# 退出,清除浏览器缓存
browser.quit()
最终发现获取的ip显示的是代理ip地址,说明自定义请求头设置成功,并已经生效了。
Modheaders这个插件的用途非常广泛,对于使用selenium进行自动化测试也会有很大的帮助,对于需要使用到自定义header的场景非常方便和实用。