1.get与post请求
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
但是两者都是HTTP协议中的两种发送请求的方法。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,即GET/POST都是TCP链接。 GET和POST能做的事情是一样一样的。如果要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
那么为什么要有各种各样的请求呢?
在万维网的世界里,TCP像汽车,我们用它来运输数据。但是如果路上跑的汽车全都一模一样,就容易发生混乱。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签,而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
谈完汽车,还要说运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。 如果用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。
以上,GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
此外,GET产生一个TCP数据包;POST产生两个TCP数据包。 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。即GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
以上来源:GET和POST两种基本请求方法的区别
import requests
url = "https://www.baidu.com/"
response = requests.get(url)
status_code = response.status_code
print(status_code)
显示200
data = {"name":"test","tags":"1234"}
response = requests.post(url,data = data)
status_code = response.status_code
print(status_code)
显示302
请求头
请求头:用来说明服务器要使用的附加信息,比较重要的有Cookie、Referer、User-Agent等。
Cookie:客户端的Cookie就是通过这个请求头属性传给服务端的。
Accept :请求报头域,可通过一个“Accept”请求头属性告诉服务端客户端接受什么类型的响应。
Referer :表示这个请求是从哪个URL过来的。
User-Agent:它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫是附加上此信息,可以伪装为浏览器;否则,很可能会被识别出爬虫。
2.正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
- 普通字符
- 非打印字符
- 特殊字符
- 限定符
- 定位符
- 元字符
- 运算符优先级
以上具体可查询正则表达式 - 语法
如果想测试所写的正则表达式: 正则表达式在线测试
常见的一些正则表达式,如汉字、英文和数字、身份证号码等,可参看常见表达式
3.实战-豆瓣电影Top250
import requests
import re
#获取链接
def allurl():
html = []
for i in range(0,250,25):
url = 'https://movie.douban.com/top250?start={}&filter='.format(i)
html.append(url)
return html
#爬取并解析内容
def movie_info(url):
movie = []
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"}
res = requests.get(url, headers=headers)
pattern = re.compile(r'.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?<p class="">.*?: (.*?) .*? (\d+).*?</p>', re.S)
content = re.findall(pattern, res.text)
for m in content:
rank = m[0]
name = m[1]
director = m[2]
year = m[3]
movie.append((rank, name, director, year))
return movie
#可视化
import pandas as pd
from pandas import DataFrame
df = {'rank':[],'name':[],'director':[],'year':[]}
all = DataFrame(df)
for url in allurl():
frame = DataFrame(movie_info(url),columns=['rank', 'name', 'director','year'])
all = pd.concat([all,frame],ignore_index=True)
结果如下:
参考资料:
1.GET和POST两种基本请求方法的区别
2.爬虫学习
3.正则表达式 - 语法
4.表达式全集
5.爬虫任务一