通过selenium进行模拟登陆,然后将Cookies传入requests,最终用requests进行网站的抓取。优点就是不但规避了“selenium”其本身抓取速度慢的问题(因为仅仅用其作为登陆),又规避了利用requests登陆时需要制作繁琐的Cookies的过程(因为是从selenium直接拿来cookies)。
利用selenium登陆
导入selenium库
from selenium import webdriver
wd = webdriver.Chrome()
(前提是已经下载好对应的webdriver并且把exe扔到了包含PATH的文件夹里,例如anaconda的文件夹里)
让webdriver为你填写用户名和密码
wd.find_element_by_xpath('用户名选项卡位置').send_keys('用户名')
wd.find_element_by_xpath('密码选项卡位置').send_keys('密码')
让webdrive点击登陆,若是按钮就选择用click(),若是表单就选择submit()。
wd.find_element_by_xpath('登陆按钮所在位置').click() #若是按钮
wd.find_element_by_xpath('登陆按钮所在位置').submit() #若是表单
登陆完成,所有的cookies现在都存在了’wd’里面,可随时调用。
将selenium的cookies传入requests
导入requests库,并构建Session()
1 | import reqeusts |
从‘wd’里调出cookies
cookies = wd.get_cookies()
将selenium形式的cookies转换为requests可用的cookies。
1 | for cookie in cookies: |
尝试用requests来抓取网页。
req.get('待测试的链接')
微博模拟登陆:
1 | import requests |
但是现在点击登陆不只有验证码了,还有手机短信验证或者手机微博扫码。更好的登陆方式在github上搜python爬虫常用网站的模拟登陆即可。 https://github.com/CriseLYJ/awesome-python-login-model
但是还有一种方法就是利用手动登陆~~ 类似见下面的知乎登陆:
1 | import time |
知乎模拟登陆
半手动登陆。仅用selenium打开一个浏览器,然后手动输入账号密码,有验证码就填验证码。等到成功登陆之后使用“get_cookies()”函数来调出它的Cookies。这个方法虽然看起来笨了点,但是效率比那些几百行的代码不知道要高多少!而且你还可以用手机扫描二维码登陆!只要这些登陆操作是在selenium所打开的浏览器内进行,selenium就可以完全记录下这些Cookies。
1 | from selenium import webdriver |
req.headers.clear() 是删除原始req里面标记有python机器人的信息。这个信息会被一些网站(比如知乎)捕捉到。造成登陆爬取失败。务必要删除!
time.sleep()可以暂停执行下面的程序。在此期间你可以进行手动登陆,扫描二维码等。然后在45秒过后再让python执行后面的“cookies = wd.get_cookies()”。selenium的get.cookies方程可以抓取到你进行手动登陆过后的cookies。时间值的设定根据自己需要的时间。如果你在程序中已经将网站名、用户名、密码、等全部输入就剩下一个验证码需要手动的话,仅设定几秒钟就可以了!加入time.sleep的好处就是程序本身是不需要停止执行的!下面的所有程序可以无缝衔接。