Python爬虫--动态获取cookies

 

我们在利用requests库发送请求时常遇到接口加密,cookies,js混淆等等问题。这个时候,推荐简单粗暴的selenium库来实现获取网页信息,就不用为反爬而发愁。(当然有些网站也会对selenium来做一些反爬措施)

 

1. selenium模拟登陆

1.1 安装

安装命令很简单,在terminal中执行下面这条命令即可。或在pycharm中setting>Project>Interpreter里面下载

pip install selenium

1.2 获取元素

  • 首先导入

from selenium import webdriver

  • 实例化

driver = webdriver.Chrome()

  • 打开URL

driver.get('https://www.zhihu.com/signin')

  • 定位登陆信息(以知乎为例)
user = driver.find_element_by_xpath('//input[@name="username"]')
user.clear()
user.send_keys('test123')
passwd = driver.find_element_by_xpath('//input[@name="password"]')
passwd.clear()
passwd.send_keys('123456')
login = driver.find_element_by_css_selector('#root > div > main > div > div > div > div.SignContainer-content'
                                            ' > div > form > button')
login.click()
time.sleep(50)  # 如果有验证码,给出输入验证码的时间
2. 获取cookies

在登录以后,获取cookies

driver.get_cookies()

这个方法获取到的cookies是列表形式的。但是如果是想塞到get或者post请求中去,需要满足请求里面的cookies的格式:name=value;

值得注意的是,分号后面需要加一个空格,最后一个name=value后面不需要加分号和空格

got_cookies = driver.get_cookies()
format_cookie = ''.join([f'{i["name"]}={i["value"]}; ' for i in got_cookies])[:-2]

将拿到的cookies格式化后,就可以将format_cookie字符串直接放到请求里面

3. 实践中遇到的坑

在不需要登录验证码的网站,这样的方案可以帮助我们解决cookie的问题,拿到cookie后就可以进行数据的爬取。但是第一次运行程序都需要打开一个chrome,看起来很烦,所以我选择使用无头浏览器。(什么是无头浏览器)

# 无头模式
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)

上面的例子是chrome浏览器的无头模式,还有很多,感兴趣可以自行查阅资料。

但是但是但是!!

换成headless模式后,cookies失效了!

经过对比,发现headless模式和正常模式获取到的cookie会有所区别。

目前还没有发现是什么原因,所以先将就用正常模式吧~

你可能感兴趣的:(爬虫,python,爬虫,搜索引擎,java爬虫程序,爬虫搜索,关键字搜索)