标题无心冒犯,就是以为这个广告挺好玩的python
前期回顾:你要偷偷学Python(第十天)web
上一篇呢,上一篇不是很好,我本身有数。因此,这一篇我准备了很多有意思的东西(坏笑),嘿嘿,快来跟我动手操做。chrome
我行,你也行!!!数据库
插播一条推送:(若是是小白的话,能够看一下下面这一段)npm
我建了一个Python学习答疑群,有兴趣的朋友能够了解一下:若是你们在学习中遇到困难,想找一个python学习交流环境,能够加入咱们的python圈,裙号947618024,可领取python学习资料,会节约不少时间,减小不少遇到的难题。json
本系列文默认各位有必定的C或C++基础,由于我是学了点C++的皮毛以后入手的Python。 本系列文默认各位会百度,学习‘模块’这个模块的话,仍是建议你们有本身的编辑器和编译器的,上一篇已经给你们作了推荐啦? 而后呢,本系列的目录嘛,说实话我我的比较倾向于那两本 Primer Plus,因此就跟着它们的目录结构吧。 本系列也会着重培养各位的自主动手能力,毕竟我不可能把全部知识点都给你讲到,因此本身解决需求的能力就尤其重要,因此我在文中埋得坑请不要把它们当作坑,那是我留给大家的锻炼机会,请各显神通,自行解决。 1234567
看到这个标题,激动不?难道,今天咱也能去盗号了吗?嘿嘿,准备好黑头套。
喂喂喂,醒醒,醒醒,哈喇子都流出来了。咱但是遵纪守法好公民,怎么去干这种事情?swift
我只会教你,怎么在人家点击了“记住帐号密码”的状况下,你给它绕过登陆验证。至于你要怎么拿到这个条件,那跟我不要紧啊,特此声明哈哈哈。浏览器
看了我前两天发的那篇“本身爬本身的照片”的博客的朋友不知道对这个流程是否还有印象,是否还有疑虑啊,这么麻烦的操做,到处体现着人的干预,机器怎么搞?你不登陆,你不保存,你不去找网址,怎么拿到cookies嘛。服务器
能问出这种问题的小伙伴(真的有)啊,我只能说你脑子挺活络的,可是不要跑偏了,上面你这几个问题,都是有技术手段能够解决的,可是咱们让爬虫可以登陆本身的帐号,就干不了不少事情吗?工具在你手上。cookie
cookie: 在网站中,http请求是无状态的,也就是说,即便第一次和服务器链接后而且登陆成功后,第二次请求服务器依然不能知道当前请求是哪一个用户。cookie的出现就是为了解决这个问题:当浏览器访问网站后,这些网站将一组数据存放在客户端,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动携带给服务器,服务器经过浏览器携带的数据就能识别当前用户。
通常为网页存在本地的一些数据,用来下次访问时回传验证,经常使用于登录验证,记住状态
session: Session是存放在服务器端的相似于HashTable的结构来存放用户 数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来惟一标识这个HashTable,并将其经过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的全部Session ID进行对比,找到这个用户对应的HashTable。
相似于客户机本地的cookie,session为服务器的’cookie’,能够实现同样的功能,每每还能够一同交互验证登录,记住状态
因此咱们能够知道,若是将Session ID经过Cookie发送到客户端的时候设置其有效时间为1年,那么在从此的一年时间内,客户端访问个人网站的时候都回将这个Session ID值发送到服务器上,服务器根据这个Session ID从内存或者数据库里面恢复存放Key-Value对的HashTable。
可是,服务器上的Session其实不会保存。过了必定的时间以后,服务器上的Session就会被销毁,以减轻服务器的访问压力。当服务器上的数据被销毁后,即便客户端上存放了cookie也没有办法“记住个人登陆状态”了。
因此,本文方法只是短时间验证cookie跳过登录验证访问之用,本地的cookie失效时间主要和服务器上session设置的时间有关。
什么是post请求?若是你没据说过post请求,那么就想一下get请求吧。
其实,post和get均可以带着参数请求,不过get请求的参数会在url上显示出来。
但post请求的参数就不会直接显示,而是隐藏起来。像帐号密码这种私密的信息,就应该用post的请求。
一般,get请求会应用于获取网页数据,好比咱们以前学的requests.get()。post请求则应用于向网页提交数据,好比提交表单类型数据(像帐号密码就是网页表单的数据)。
打开CSDN的登陆页面,填上你的我的信息:https://passport.csdn.net/login?code=public
该勾的勾,该选的选,而后点击登陆。
你猜是哪一个包啊,耍点小聪明啊,你看你登陆成功以后,右边还在不断的加载包,那就能够断定登陆包确定在前边。
点击登陆以后,信号一传送,第一步确定是登陆,因此就前几个包看一下,一眼就看到了那个“doLogin”吧,点开。
看到没,post、
内啥,看到一大串的set-cookies了吗?没别的意思,我就提一下哈哈哈哈哈哈。
呐,我给你画出来了。
上面我提那一下啊,其实我是想说,都打开,不一样网站不同,指不定在哪一个小角落里发现了你的小饼干呢。
其实不止小饼干啊,帐号密码都有:
咱们来试试另外一种登陆方式,带参登陆。
import requests #引入requests。 url = 'https://www.csdn.net/' #把请求登陆的网址赋值给url。 headers = { 'origin':'https://passport.csdn.net', # 请求来源,本案例中实际上是不须要加这个参数的,只是为了演示 'referer':'https://passport.csdn.net/login', 'User-Agent':'省略' } #加请求头,前面有说过加请求头是为了模拟浏览器正常的访问,避免被反爬虫。 data = { "loginType": "1", "pwdOrVerifyCode": "密码", "userIdentification":"帐号" } #把有关登陆的参数封装成字典,赋值给data。 login_in = requests.post(url,headers=headers,data=data) print(login_in) 123456789101112131415161718192021
好的,返回值403,草率了。。
没事了,没事了。
哦,我又不断地尝试了,终于成功的登陆上了:
import requests from bs4 import BeautifulSoup header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36', 'Connection': 'keep-alive', 'accept': 'application/json, text/plain, */*', #'Cookie': cookie, 'referer': “个人博客”页面网址 } url = 上面那个referer data = { "loginType": "1", "pwdOrVerifyCode": 你的, "userIdentification":你的 } #把有关登陆的参数封装成字典,赋值给data。 login_in = requests.post(url,headers=header,data=data) print(login_in) 1234567891011121314151617181920212223
好极,此次返回值是200了。
接下来干吗?接下来找一篇博客评论一下这事儿就算过去了。
cookies = login_in.cookies
#提取cookies的方法:调用requests对象(login_in)的cookies属性得到登陆的cookies,并赋值给变量cookies。 url_1 = 本身找 #咱们想要评论的文章网址。 data_1 = { 'content': 'test', 'articleId':我的填 } #把有关评论的参数封装成字典。 comment = requests.post(url_1,headers=header,data=data_1,cookies=cookies) #用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookies参数,赋值给comment。 #调用cookies的方法就是在post请求中传入cookies=cookies的参数。 print(comment.status_code) #打印出comment的状态码,若状态码等于200,则证实咱们评论成功。 123456789101112131415
以状态码为准,有时候慢起来要等一天你才能看获得。
若是真等了一天还评论不上去,没事,我跟你说,那应该是被后台给切了。
没事,咱们后面还会有更好的办法。
算了,为了看着直观,我仍是把以前那段爬学生证的代码节选一下吧。
import requests from bs4 import BeautifulSoup cookie = '''*此处粘贴从chrome中复制的cookie信息*''' header = { 'User-Agent': '放你本身的', 'Connection': 'keep-alive', 'accept': '放你本身的', 'Cookie': cookie, 'referer': '放你本身的博客主页地址' } url = 'https://blog.csdn.net/python_miao?spm=1010.2135.3001.5113' # csdn 我的中心中,加载名字的js地址 seesion = requests.session() response = seesion.get(url,headers=header) print(type(session.cookies)) #打印cookies的类型,session.cookies就是登陆的cookies 123456789101112131415
好极,能够看到结果是:<class ‘requests.cookies.RequestsCookieJar’>
这玩意儿怕是不能存到文本里面吧,谁去试一下看看。
不过仔细观察一下吧,这个cookies有没有长得挺像一个字典型字符串啊
本身动手啊,我就说要一句:其实不用转字符串也能够试一下,不行了再转也不迟。
固然了,还有其余的方式获取到cookies,不过我这套方法是最直接的了。
如今的网站啊,也都不是傻子,哪一个登陆不要你验证码的?极少数吧。
那这验证码不就得你手动去输入了,固然,也有人说什么机器学习啊,破解验证码啊,想法不错,动手试试嘛。
还有的网站啊,想必你也碰到过吧,阡陌交通,错综复杂的,爬个球啊爬。
就更不要说那些URL加密了啊,或者直接禁止爬虫的网站了。
好,接下来咱们就来看看这项即将要接触的新技术:selenium可以帮助咱们闯过多少障碍。
粗略展现一下,打开浏览器,打开一篇博客,而后关掉,至于其余高端操做,咱们后面经过代码来展现:
# 本地Chrome浏览器设置方法 from selenium import webdriver import time driver = webdriver.Chrome() driver.get('https://mp.toutiao.com/profile_v4/graphic/articles') time.sleep(2) driver.get('https://www.toutiao.com/i6887003700720566795/') time.sleep(2) driver.close() 1234567891011121314
代码给大家,大家拿去试试看,多半是运行不起来的,由于大家多半没有配置环境。
好,没环境都不用着急,一切都会如期而至的嘛。
首先,你须要一个谷歌浏览器,一直在说,应该没有小伙伴还没下载吧。
其次,你须要看一下你的谷歌浏览器的版本,这个很重要,由于一代版本对应的是一代驱动,匹配不上的话问题就会有点麻烦了。
接下来,咱们来下载一个驱动:http://npm.taobao.org/mirrors/chromedriver/
版本本身挑啊。
下载完以后,解压,把这个驱动放到Python安装的同级目录下,若是不知道是哪一个,那就下载了有多少个Python安装嫌疑目录就放多少个呗。
好,再打开pycharm,运行前面的代码。
哦,对了,你还要下载一个selenium的包,还有点大。
今天不讲太多的操做,就开个头,字数也八千多了,把好玩的东西都留到下一篇嘛。
那接下来来说一下上面那几行代码,开个好头,我知道,可能会有小伙伴接着就本身去查了啊。
#第一步,导入模块,不过多赘述 from selenium import webdriver import time driver = webdriver.Chrome() #获取对谷歌浏览器的控制权,这里若是没有驱动的话是会直接报错的 driver.get('') #命令谷歌浏览器:嘿,小样儿,给我打开这个网页 time.sleep(2) #主要是由于浏览器慢了点,仍是说网络慢了点,反正就是有延迟,你等两秒呗。 driver.get('https://lion-wu.blog.csdn.net/article/details/109244401') #再开一个 time.sleep(2) #同上 driver.close() #行了,玩到这里,关了 123456789101112
我就这么说吧,上面这一段,把Chrome浏览器设置为引擎,而后赋值给变量driver。driver是实例化的浏览器,在后面你会老是能看到它的影子,这也能够理解,由于咱们要控制这个实例化的浏览器为咱们作一些事情。
你懂得。
selenium能把咱们前面遇到的问题简化,爬动态网页如爬静态网页同样简单。
刚开始咱们直接用BeautifulSoup就能处理掉的那种网页,就是静态网页。咱们使用BeautifulSoup爬取这类型网页,由于网页源代码中就包含着网页的全部信息,所以,网页地址栏的URL就是网页源代码的URL。
后来,咱们开始接触更复杂的网页,我要是没有记错的话,咱是从抓取CSDN的评论开始的吧,那时候咱们开始接触到了json。
还有后面的QQ音乐,要爬取的数据不在HTML源代码中,而是在json中,你就不能直接使用网址栏的URL了,而须要找到json数据的真实URL。这就是一种动态网页。
不论数据存在哪里,浏览器老是在向服务器发起各式各样的请求,当这些请求完成后,它们会一块儿组成开发者工具的Elements中所展现的,渲染完成的网页源代码。
在遇到页面交互复杂或是URL加密逻辑复杂的状况时,selenium就派上了用场,它能够真实地打开一个浏览器,等待全部数据都加载到Elements中以后,再把这个网页当作静态网页爬取就行了。
说了这么多优势,使用selenium时,固然也有美中不足之处。
因为要真实地运行本地浏览器,打开浏览器以及等待网渲染完成须要一些时间,selenium的工做不可避免地牺牲了速度和更多资源,不过,至少不会比人慢。因此上面让你等着,年轻人嘛,宁停三分钟,不抢一秒钟嘛。
就到这里啊,留点悬念嘛。
最后多说一句,想学习Python可联系小编,这里有我本身整理的整套python学习资料和路线,想要这些资料的均可以进q裙947618024领取。
本文章素材来源于网络,若有侵权请联系删除。