相信很多python学习者都和我一样在刚开始学习爬虫时,对见到的网站都有种跃跃欲试的冲动,像豆瓣电影、电影天堂以及各类壁纸写真图片网站的等等,但这些都是不需要登陆账号就可以直接请求解析网页获取资源链接的,如果遇到需要登陆账号的网站时就不行了。这个时候小编就及时出来解决大家的问题,给大家准备了一份模拟登陆代码供大家学习。
环境准备
python3.5
selenium模块
模拟登陆思路
通过selenium中的webdriver控制浏览器登录目标网站,然后获取模拟登陆需要的Cookie,再利用此Cookie来达到登录的效果。本次我们使用webdriver来驱动火狐浏览器插件。在登录网站时,cookie保存在发起请求的客户端中,网站服务器利用cookie来区分不同的客户端。cookie里面记录了“访问登录后才能看到的页面”这一行为的信息,含有能够向服务器证明:“我刚才登录过”。因此cookie可以用来标识客户端的身份,以存储它的信息。
登录步骤
导入模块
- from selenium import webdriver
- import requests
- import json
启动浏览器
通过webdriver驱动火狐浏览器,然后在加载将要访问的目标网站
- driver = webdriver.Firefox()
- driver.get('目标网站')
点击登录
找到网页中登录按钮所在的位置,通过浏览器模拟点击打开登录框,然后找到用户名和密码框的位置,输入用户名及密码,在寻找按钮以及密码输入框时可鼠标右键然后找到“查看元素”选项,点击之后可在网页源码中寻找。代码如下
- #清空登录框
- driver.find_element_by_xpath("./*//input[@name='username']").clear()
- #自动填入登录用户名
- driver.find_element_by_xpath("./*//input[@name='username']").send_keys(user)
- #清空密码框
- driver.find_element_by_xpath("./*//input[@name='password']").clear()
- #自动填入登录密码
- driver.find_element_by_xpath("./*//input[@name='password']").send_keys(password)
- time.sleep(8)
- #点击登录按钮进行登录
- driver.find_element_by_xpath("./*//button[@name='loginsubmit']").click()
- time.sleep(10)
记录cookie
经过上面几步,如果没有报错的话就说明已经登录成功了,接下来我们再次加载网页获取登录cookie。代码如下
- driver.get('目标网站')
- #获取cookies
- cookie_items = driver.get_cookies()
- for cookie_item in cookie_items:
- post[cookie_item['name']] = cookie_item['value']
- cookie_str = json.dumps(post)
- with open('cookie.txt', 'w', encoding='utf-8') as f:
- f.write(cookie_str)
- f.close()
通过cookie登录
获得cookie之后,模拟登陆就跟之前一样用requests请求网站,只需要将cookie内容加到请求中即可。代码如下
- header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64;rv:53.0) Gecko/20100101 Firefox/53.0"}
- with open('cookie.txt', 'r', encoding='utf-8') as f:
- cookie = f.read()
- cookies = json.loads(cookie)
- res = requests.get(url=url, cookies=cookies, headers=header)
对于有些网站来说,cookie的生命期较长,所以在第一次登陆获取cookie后,在以后模拟登陆时只需要调用此cookie即可,十分方便。
具体代码如下
- from selenium import webdriver
- import time
- import json
- user="用户名"
- password="密码"
- driver = webdriver.Firefox()
- driver.get('目标网站')
- time.sleep(5)
- driver.find_element_by_xpath("./*//button[@type='submit']").click()
- print("正在输入用户名和密码")
- #清空登录框
- driver.find_element_by_xpath("./*//input[@name='username']").clear()
- #自动填入登录用户名
- driver.find_element_by_xpath("./*//input[@name='username']").send_keys(user)
- #清空密码框
- driver.find_element_by_xpath("./*//input[@name='password']").clear()
- #自动填入登录密码
- driver.find_element_by_xpath("./*//input[@name='password']").send_keys(password)
- time.sleep(8)
- #点击登录按钮进行登录
- driver.find_element_by_xpath("./*//button[@name='loginsubmit']").click()
- time.sleep(10)
- driver.get('目标网站')
- #获取cookies
- cookie_items = driver.get_cookies()
- #获取到的cookies是列表形式,将cookies转成json形式并存入本地名为cookie的文本中
- for cookie_item in cookie_items:
- post[cookie_item['name']] = cookie_item['value']
- cookie_str = json.dumps(post)
- with open('cookie.txt', 'w', encoding='utf-8') as f:
- f.write(cookie_str)
- f.close()
- print("登录完成")
联系客服