[success]前面静态网页和动态网页我们都爬了一遍,现在我们来爬那些需要登录的页面,其实这个也很简单,就是找出表单提交的post地址,然后自己提交数据即可。[/success]
其实这个有很多种方法,第一种就是直接把cookie数据发过去,这样就可以直接绕过登录,前面我们爬B站个人信息的时候就用过这个方法,第二种就是自己模拟登录,然后获取cookie数据,我们拿一个不需要验证码的网站入手(笔趣阁):先找到我们的提交地址
很容易就找到了登录页面,主要思路就是自己模拟post提交账号密码,然后获取服务器传过来的cookie数据,最后通过cookie数据就可以登录成功,然后就可以获取到自己的一些数据,比如我获取自己书架数据,下面就直接贴代码:
# -*- coding:UTF-8 -*-
import requests,json,time
from bs4 import BeautifulSoup
target='https://www.yangguiweihuo.com/user/login.php?action=login&usecookie=1&url=https://www.yangguiweihuo.com/xuanhuanxiaoshuo/'
target1='https://www.yangguiweihuo.com/user/bookcase.php'
headers={'Referer':'https://www.yangguiweihuo.com/xuanhuanxiaoshuo/','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}
a=input("请输入用户名:")
b=input("请输入密码:")
data={'username':a,'password':b}#这里是把数据保存起来以便后面发送post请求使用
req=requests.post(url=target,data=data,headers=headers)#发送post请求
a=req.request.headers#这里是获取cookie数据
cookie=[]#cookie数据就只有三个是重要的一个是id一个是用户名,一个是bookkey
for line in a['Cookie'].split('; '):
i=line.find('=')
cookie.append(line[i+1:])#把cookie处理一下,放到列表里面
cook="userid="+cookie[0]+"; bookkey="+cookie[2]+"; username="+cookie[1]#合并cookie数据
headers={'Cookie':cook,'Referer':'https://www.yangguiweihuo.com/xuanhuanxiaoshuo/','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}
req=requests.get(url=target1,headers=headers)#发送get请求获取书架信息
req.encoding=('GBK')#编一下码
bf=BeautifulSoup(req.text,'lxml')
a=bf.find_all('span')#对网页进行处理,获取我们需要的数据
for each in range(3):#下面就是把我们的数据输出
print("%s " %(a[each].find('b').string) ,end="")
print("")
for each in range(7,len(a),7):
print(a[each].string.ljust(6, ' '),end="")
print(a[each+1].find('a').string.ljust(15, ' '),end="")
print(a[each+2].string.ljust(10, ' '),end="")
print("")
这里在我的电脑上好像出了点bug,所以我就用我的那个笔记本跑的,实验还是成功了的:
除了这个,我们还可以使用真实的浏览器来访问,这个其实就是Python控制浏览器,所以这个不仅可以模拟登录,还可以用获取那种靠脚本获取数据的网页数据,我们这里只是简单的跑一下。当然我们需要安装selenium这个库,安装直接用pip install selenium
就行了。然后还需要装一下驱动:直接到http://chromedriver.storage.googleapis.com/index.html下载驱动文件,关于驱动的对应可以自己上网查。
这个东西里面的内容还挺多的我一时半会也说不清,所以我还是直接贴代码和演示:
#-*- coding:UTF-8 -*-
from selenium import webdriver
username='test123'
passwdvalue='12345678'
browser = webdriver.Chrome()#新建一个谷歌浏览器
browser.get('https://www.yangguiweihuo.com')#让浏览器访问这个网页
user=browser.find_element_by_name("username")#获取用户名的输入框
passwd=browser.find_element_by_name("password")#获取密码的输入框
submit=browser.find_element_by_xpath("//div[@class='frii']//input")#获取提交按钮
user.send_keys(username)#输入用户名
passwd.send_keys(passwdvalue)#输入密码
submit.click()#点击登录按钮
print(browser.get_cookies())#把浏览器获得的cookie数据打印出来
可以看到Python自己打开浏览器然后输入数据然后点击登录按钮,这都是自动完成的,这就是一个真正的浏览器环境,所以可以获取一些我们常规方法获取不到的东西,但是缺点也是非常大,就是这个效率非常低,因为这个要加载所有的东西。