Python 最基本的语法
- 什么是编程语言
- 什么是Python
- 不同平台使用Python
- 高频的输出语句 print( )
- 向前一步吧 有类型数据
- 不可或缺的输入 input( )
- 抉择 if 与徘徊 for
- 抽象的函数
HTTP协议
常用HTTP请求
URL
Requests Headers
IP地址分类
网页的组成
请按照顺序依次观看:
什么是编程语言:> http://c.biancheng.net/cpp/html/1721.html
30分钟玩转Python:> http://c.biancheng.net/view/2010.html
Python教程:> http://c.biancheng.net/python/
p.s. 如果想快速上手,就不要想着走捷径。不过,Python教程可以只看下面几节。
看完了这些一定要看第3章 ,是爬虫最有用第一节
哪怕以前没有学过编程,也没关系。我是为零基础而写的。只需要您有一部手机或电脑多敲代码。
本篇主理论,具体的例子,会分散于爬虫专题的每篇中,敬请期待!
下面的例子,大部分看不懂可跳过,不过还请认真看。
HTTP协议
HTTP协议是Web人员必须掌握的知识,爬虫也不例外。
HTTP协议 也叫 超文本传输协议,浏览器通过HTTP协议与Web服务器交互,进行通信与传输数据。如,浏览网页、注册登录、发布文章、上传下载等等。
p.s. 超文本的意思是,不只文本,还有视频、声音等等。
HTTP协议是明文协议,并不安全容易被截获窃听 端口是 80 (端口:Web服务器在80端口与浏览器交互);
HTTP协议经过 TLS、SSL加密算法后变成 HTTPS协议 端口是 443;
端口号 | 服务类型 |
21、2121 | ftp |
22 | ssh |
25 | smtp (发邮件) |
80、8080、3128 | http |
110 | pop (收邮件) |
443 | https |
23、3389 | telnet远程桌面(黑客入侵时用于隐藏身份) |
1080 | socks(速度快) |
554 | rtsp |
常用HTTP请求
HTTP协议是一种基于请求和响应的模型,图示在第一篇博客。
浏览器发送一个请求,服务器接受了会发一个响应即 Response,在requests库里面是一个对象。
查看的方法,很简单。几乎每篇博客都有讲,所以不急,说不定看到某篇就会恍然大悟呢,我们重点讲请求方式
浏览器请求方式 | 说明 |
Get | 获取requests-url的资源 |
Post | 获取requests-url的资源时用表单形式附加数据给服务器 |
Head | 获取requests-url的资源头部,检查超链接有效性、网页修改 |
Put | 请求服务器存储一个资源,并用requests-url标识 |
Delete | 请求服务器删除requests-url所标识的资源 |
那么requests-url是什么鬼 ??
url : 统一资源定位符 (Uniform Resource Locator) ,说白了就是网址呗。
网址格式从来没注意过吧!格式如下,
协议 :// 服务器 IP [ :端口] /路径/[?查询]
e.g. https://blog.csdn.net/qq_41739364/article/details/88084403
e.g. https://blog.csdn.net/qq_41739364/article/details/86775886
TA们其实只是Web服务器的一个路径,URL您可以理解为查询路径。
如果是浏览器Get请求,里面的内容可以在浏览器的开发者工具看到。
可视化理解:使用 Fiddler (即小提琴 应用软件) 观察 HTTP协议,考察所有"进出"的数据这个过程俗称 “抓包”。
Requests Headers
这是Google Chrome浏览器的开发者工具查看网页请求报文的 Requests Headers 部分
method : 请求方式,
如果是Get,代码如,
import requests
response = requests.get('https://blog.csdn.net/qq_41739364')
如果是Post一般以表单形式提交,
import requests
data = {
'username': 'Debroon',
'password': ':123456789'
}
response = requests.post('https://blog.csdn.net/qq_41739364', data=data)
accept:通知服务器,用户代理(浏览器等客户端)能够处理的媒体类型及媒体类型的相对优先级。
常用的媒体类型有以下几类:
文本文件:text/html,text/plain,text/css,application/xhtml+xml,application/xml...
图片文件:image/jpeg,image/gif,image/png...
视频文件:video/mpeg,vedio/quicktime...
应用程序使用的二进制文件:application/octer-stream,application/zip...
cookie : 记录状态信息,因为HTTP协议是无状态协议(没有记忆)。如我们登录网页,浏览器就记住了,下一次不需要重复登录,不过cookie也会过期那时候就需要重新登录。
Name | Cookies名称 |
Value | Cookies值,Unicode字符是字符编码,二进制是BASE64编码 |
Domain | Cookies域名 |
Max Age | Cookies失效时间,单位秒 |
Path | Cookies使用路径 |
Size | Cookies大小 |
HTTP | Cookies包含httponly属性,若为真则HTTP头带Cookies信息 |
Secure | Cookies断言,默认值false表示以HTTPS或SSL加密 |
cookie这个参数在爬虫里面有时候不用不行。
import requests
url = 'https://www.baidu.com'
headers = {
'cookie': 'uuid_tt_dd=10_19904453150-1549009901634-808423; smidV2=201902011631453b736b8bff427248aab818365387213e0048460bd254e60c0; UN=qq_41739364; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=1788*1*PC_VC!5744*1*qq_41739364; UM_distinctid=16913203d14260-00a7abe0271b09-10346654-100200-16913203d15123; hasSub=true; dc_session_id=10_1551572310279.776002; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1551534354,1551534419,1551572312,1551572318; SESSION=b6639b87-fc3d-4bdf-aa96-1aa7bdaa2fde; UserName=qq_41739364; UserInfo=5f9415c9f3474f4fad5a49a1390245b6; UserToken=5f9415c9f3474f4fad5a49a1390245b6; UserNick=Debroon; AU=690; BT=1551602704609; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1551611508; dc_tos=pnsf3u'
}
response = requests.get(url, headers=headers)
refer : 记录浏览器上次访问的URL,有的网站会通过请求中有没有携带这个参数来判断是不是爬虫,从而确定是否限制访问。所以有时候也需要在headers中添加上这个参数。
user-agent : 标识请求的浏览器身份的也叫UA,大部分网站都会通过请求中有没有携带这个参数来判断是不是爬虫,从而确定是否限制访问。所以有时候也需要在headers中添加上这个参数,因为User-Agent默认值为python-requests/2.18.4(数字会变),这样就容易被网站识别出是一个爬虫,从而限制爬取。代码如,
import requests
url = 'https://blog.csdn.net/qq_41739364'
headers = {
'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
response = requests.get(url, headers=headers)
但当我们要爬取的数据量比较大的时候,用一个user-agent是不够的,因为服务器很聪明,一个浏览器不停地在访问我的URL,而且频率那么快,肯定是那个挨千刀的程序员写的爬虫,马上就会限制爬虫访问,所以我们经常会用一个user-agent列表,来回地切换。这样服务器就会以为是多个浏览器(也就是多个用户)在访问URL,会判断这是正常的。代码如,
import requests, random
url = 'https://blog.csdn.net/qq_41739364'
agent_list = ['Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)']
# 这是一个User-Agent列表,在使用的时候随机从中选取一个作为请求头的参数传递进去
headers = {
'user-agent': random.choice(agent_list)
}
response = requests.get(url, headers=headers)
IP地址分类
快递地址 = 大地址 + 小地址,如某个地点地址,大地址是中华人民共和国X省X市,小地址是x镇x乡x区。
IP地址也是类似的。意不意外,地址就是这么表示的。
IP地址 = 网络号 + 主机号
共4个字节, 格式形如,(IPV4)
A类:第一个字节表示网络(号),第 1 位为 0 范围在1-126,其余的字节存储主机(号) 可容纳台主机(这么多人可以同时上网)
掩码 (隐藏主机号1个字节) : 255. 0. 0. 0
B类:前二个字节表示网络(号),第 2 位为 10 范围在128-191,其余的字节存储主机(号) 可容纳台主机
中科大B类网络:159. 226. xx. xx
清华B类网络 :166. 111. xx. xx
北大B类网络 :162.105. xx. xx
掩码 (隐藏主机号2个字节) : 255. 255. 0. 0
C类:前三个字节表示网络(号),第 2 位为 110 范围在192-223,其余的字节存储主机(号) 可容纳台主机(255是一个广播地址)
掩码 (隐藏主机号3个字节) : 255. 255. 255. 0
私有:192. 168. x. x 、10. x. x. x ...
还有一类特殊的IP地址,
全 0 =》 主机自己
全 1 =》 有线广播 即(255)
网络号全 0 + 主机号全 1 =》 网络上所有主机
网络号全 1 + 主机号全 0 =》 定向网络广播
127: xxx : 回送
网页的组成
网页 = html(大致框架) + css(美化布局) + javaScript(实时交互)