之前写过一篇关于爬虫的文章,其中提到了用python requests包请求网页,并用beautifulsoup解析。

https://blog.csdn.net/qq_40589051/article/details/90579064

当时那篇文章中的网页都是不需要登陆的,而且由于赶项目所以学的那叫一个囫囵吞枣。请求,协议之类的知识点都没有怎么搞清楚,后来我发现网上的大佬们对于模拟登陆的方法颇有心得,所以我最近小小的研究了一下下。自己平时也很少研究爬虫,所以有什么错请多多包涵~

这篇文章着重介绍的是如何模拟登陆微博,所以解析网页源代码的代码就没有放上来啦。

-------------------目录---------------------

1.cookie和headers,究竟是什么?如何查看?谜一样的HTTP协议!

2.微博爬虫的三种实现方法(理论)

3.微博模拟登陆实现代码详解(实战)

4 http协议中post和get请求的不同

5 python各种爬虫包大起底!urllib、urllib2、requests。

包教包会诶~~~童叟无欺!

正文:

1.cookie和headers,究竟是什么?如何查看?谜一样的HTTP协议

我还是个学通信的.....今天打死都想不起这些知识点,简直惭愧......

我们在做爬虫的时候,其实是在模拟浏览器(用户)的行为,去爬取所需要的信息。

简单来说,爬虫得模拟我们正常使用浏览器进网站的过程,首先是给网站一个请求,网站接受到请求之后,会发回一个响应。

这个请求和响应要按照一定的格式来构建,格式乱七八糟的当然不行,所以为了方便大家上网,专门为访问万维网所设置的HTTP协议诞生啦!

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议,其基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP协议请求消息有四个部分:请求行(request line)、请求头部(header)、空行和请求数据。

这里就不细讲了,主要将爬虫需要用到的headers。

headers(请求头部)就是HTTP请求和响应的核心部分,它记录了客户端浏览器、请求页面、服务器等相关信息。在写爬虫的过程中,获得headers的信息是非常重要的!

我使用的是谷歌浏览器,打开一个页面,按下f12,进入network,随便在name下点击一个动态,你就可以看见响应和请求的heders了。这个user-agent就是爬虫所需要的模拟浏览器的必要伪装之一。User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。所以我们的程序里面得使用这个来表明自己不是爬虫。

headers讲完了,那cookie又是个什么呢?

你的小饼干是存储在本地端上的数据,包含了访问用户的基本信息,比如用户名、计算机名字、使用的浏览器名字和曾经访问的网站。它被保存在本地浏览器目录下。可以让网站辨别你的身份,进行会话跟踪,因为涉及隐私,所以一般是加密的。

cookie应用点在于判断注册用户是否登录,此时会弹出提示,是否下一次进同样网站时自动登录;购物车,用户在一个网站的不同页面中选择的不同商品的信息,也被保存在cookie中,方便最后结账。

cookies的获取是按control+shift+j,输入document.cookie后回车得到的一大串字符,每个网站对应一个,涉及隐私所以一定要保护好哦~

获得这两大模拟浏览器的利器之后,再来看看如何模拟登陆。

2.微博爬虫的三种实现方法(理论)

1 直接先在浏览器上先登陆,然后再调用微博上的api,获取需要的文本。

2 直接填入cookies,user-agent等信息,简单粗暴。

3 使用post请求登陆,把用户名,密码还有cookie保存下来模拟登陆。

3.微博模拟登陆实现代码详解

第一个方法就不用介绍了吧~偷懒的方法。咱们直接从第二个开始。

import urllib.requestheaders = {'cookie':'你的cookie',
'User-Agent':'你的user-agent'}url = 'https://m.weibo.cn/detail/4400540303485380'response = urllib.request.Request(url,headers=headers)
data=urllib.request.urlopen(response).read().decode('utf-8','ignore')
print(data)

cookie是你登陆微博页面之后查到的cookie,user-agent也在开发者模式中得到,这样我们就可以构建headers!再使用urllib去获取网页中的内容你就OK啦!

这个方法简单粗暴,缺点是不能适用于大规模的爬取,cookie还会过期(一天就过期了),所以还是得使用第三种方法!

使用post请求登陆,把用户名,密码还有cookie保存下来模拟登陆。

这个我看了网上两个很好的回答,主要是要自己能理解这段代码的含义:

http://lovenight.github.io/2015/11/23/Python-%E6%A8%A1%E6%8B%9F%E7%99%BB%E5%BD%95%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A/

https://www.douban.com/note/201767245/?start=100#comments

用户名和密码都是通过base64加密的,所以需要解码。

post请求是使用的request body,使用httpfox可以看到滴~

这是大佬写的代码。

import requests
import json
import base64def login(username, password):username = base64.b64encode(username.encode('utf-8')).decode('utf-8')postData = {"entry": "sso","gateway": "1","from": "null","savestate": "30","useticket": "0","pagerefer": "","vsnf": "1","su": username,"service": "sso","sp": password,"sr": "1440*900","encoding": "UTF-8","cdult": "3","domain": "sina.com.cn","prelt": "0","returntype": "TEXT",}loginURL = r'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)'session = requests.Session()res = session.post(loginURL, data = postData)jsonStr = res.content.decode('gbk')info = json.loads(jsonStr)if info["retcode"] == "0":print("登录成功")# 把cookies添加到headers中,必须写这一步,否则后面调用API失败cookies = session.cookies.get_dict()cookies = [key + "=" + value for key, value in cookies.items()]cookies = "; ".join(cookies)session.headers["cookie"] = cookieselse:print("登录失败,原因: %s" % info["reason"])return sessionif __name__ == '__main__':session = login('你的用户名', '你的密码')

4 http中post和get请求的不同

  • GET在浏览器回退时是无害的,而POST会再次提交请求。

  • GET产生的URL地址可以被Bookmark,而POST不可以。

  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。

  • GET请求只能进行url编码,而POST支持多种编码方式。

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

  • GET请求在URL中传送的参数是有长度限制的,而POST么有。

  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  • GET参数通过URL传递,POST放在Request body中。

5 python各种爬虫包大起底!

python中网络模块中的包常见的有urllib123代,requests包。

request快速使用指南在此:https://2.python-requests.org//zh_CN/latest/#

urllib

class urllib.request.urlopen(urldata=None, [timeout, ]*cafile=Nonecapath=Nonecadefault=Falsecontext=None

打开统一资源定位地址 url,可以是一个字符串或一个 Request 对象。

class urllib.request.Request(urldata=Noneheaders={}origin_req_host=Noneunverifiable=Falsemethod=None

This class is an abstraction of a URL request.

url 应该是是一个含有一个有效的统一资源定位地址的字符串。

之前的代码就是用到的这个包,是不是很方便呀!

urllib2

从官网摘下来的我用到过的一些方法,其实和urllib区别不大。

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

Open the URL url, which can be either a string or a Request object.

This function returns a file-like object with three additional methods:

  • geturl() — return the URL of the resource retrieved, commonly used to determine if a redirect was followed

  • info() — return the meta-information of the page, such as headers, in the form of an mimetools.Message instance (see Quick Reference to HTTP Headers)

  • getcode() — return the HTTP status code of the response.

class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

This class is an abstraction of a URL request.

The following methods describe all of Request’s public interface, and so all must be overridden in subclasses.

Request.add_data(data)

Set the Request data to data. This is ignored by all handlers except HTTP handlers — and there it should be a byte string, and will change the request to be POSTrather than GET.

Request.get_method()

Return a string indicating the HTTP request method. This is only meaningful for HTTP requests, and currently always returns 'GET' or 'POST'.

Request.has_data()

Return whether the instance has a non-None data.

Request.get_data()

Return the instance’s data.

Request.add_header(keyval)

Add another header to the request. Headers are currently ignored by all handlers except HTTP handlers, where they are added to the list of headers sent to the server. Note that there cannot be more than one header with the same name, and later calls will overwrite previous calls in case the key collides. Currently, this is no loss of HTTP functionality, since all headers which have meaning when used more than once have a (header-specific) way of gaining the same functionality using only one header.

Request.add_unredirected_header(keyheader)

Add a header that will not be added to a redirected request.

New in version 2.4.

Request.has_header(header)

Return whether the instance has the named header (checks both regular and unredirected).

New in version 2.4.

Request.get_full_url()

Return the URL given in the constructor.

Request.get_type()

Return the type of the URL — also known as the scheme.

Request.get_host()

Return the host to which a connection will be made.

Request.get_header(header_namedefault=None)

Return the value of the given header. If the header is not present, return the default value.

requests

上面那位大佬就是使用的request进行的微博的模拟登陆,而且使用的是post请求,还使用了会话(session)~详细的都在这个官网的代码中~

https://2.python-requests.org//zh_CN/latest/user/quickstart.html#id2

今天先写到这里吧,才研究两天,感觉只学到了一点皮毛呀,不过现在可以小批量的爬取微博等需要登录的网站的信息啦,开心~

Python爬虫实现--微博模拟登陆--涉及到的知识点,python包,实现代码详解。相关推荐

  1. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  2. 利用python爬虫(part15)--cookie模拟登陆

    学习笔记 文章目录 cookie模拟登陆 获取cookie 爬取我的简介 cookie模拟登陆 有的时候,我们想要抓取一个网站,但是需要先登录才能访问它,如果不输入用户名和密码,我们就会一直停留在登录 ...

  3. python爬虫使用selenium模拟登陆人人网

    谷歌浏览器:chromedriver驱动资源下载地址: https://chromedriver.storage.googleapis.com/index.html 人人网是我们10多年前,在校学生一 ...

  4. python通过DictReader实现两个csv文件的映射查找lookup之代码详解

    python里应用DictReader的实现匹配查找 需求简介 通过应用DictReader读取csv文件,实现通过一个CSV在另外个CSV里找到对应的解释,类似lookup. 数据内容 1 这里假定 ...

  5. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  6. Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

    Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...

  7. [Python爬虫] 四、数据抓取之HTTP/HTTPS抓包工具Fiddler

    往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 [Python爬虫] 三.数据抓取之Request ...

  8. 视频教程-Python爬虫视频课程:中国女性胸部大小分析-Python

    Python爬虫视频课程:中国女性胸部大小分析 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲师,制作视频 ...

  9. python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解

    导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...

最新文章

  1. resnet keras 结构_Wandb用起来,一行Python代码实现Keras模型可视化
  2. Mac Os 基本命令行
  3. python画笑脸-如何用Python画滑稽笑脸
  4. java 显示透明背景png图片
  5. android 放大镜动画,Android在图片上进行放大镜效果(放大镜形状)
  6. heatmap(热图)
  7. 最新战火互娱JS逆向分析实战教程
  8. Window CE 驱动开发流程(Windows CE.5.0系统、pxa270平台)
  9. 第二季-专题3-汇编语言得玩转
  10. 简析边缘数据中心技术
  11. ansible shell 之运行后台程序
  12. Weak Pointer
  13. JAVA毕业设计共享充电宝管理系统计算机源码+lw文档+系统+调试部署+数据库
  14. 手机OTG 我的世界_别再给手机外接OTG键鼠玩刺激战场了:其实还能这样操作
  15. 常用语言注释使用格式
  16. Silvaco学习笔记(六)毕设相关
  17. 毕业论文管理系统(类图、ER图)、时序图
  18. 什么是CODECO 报文?
  19. uniapp 模块权限配置 权限管理中英对照
  20. STM32开发笔记48:STM32F4+DP83848以太网通信指南系列(二):系统时钟

热门文章

  1. 巧妙利用POPO2004使MSN实现隐身留言功能(转)
  2. 开源“上天入地”的本领都在这!2023 开放原子全球开源峰会「开源展览」一文拿捏!
  3. Java之implements
  4. java实现图片切割_【Java】K-means算法Java实现以及图像切割
  5. 解决linux系统下因分区目录划分过小,导致tomcat使用系统临时文件夹(/tmp)没有足够空间而报错的问题
  6. QQ如何设置关闭“可能认识的人”推荐
  7. HDU - 5640 -King's Cake
  8. 自定义kindeditor富文本默认的宽高
  9. 也谈细节决定成败——《细节决家成败》读后感
  10. 二路归并排序c语言实现