爬虫,早有耳闻。整个世界就像一张巨大的蜘蛛网,而爬虫就是在描述这种千丝万缕的关系。持续更新,梳理。
越伟大,越有独创精神的人越喜欢孤独。(赫胥黎)
爬虫
爬虫就是模拟客户端(浏览器)发送网络请求,获取响应,按照规则提取数据的程序。对于爬取到的数据可以呈现在网页或APP上,也可以对其进行数据分析寻找规律。
(一)URL
浏览器的请求
比如在浏览器随意做个搜索,这里搜索“爬虫”,空白处右键->审查元素->Network->F5->左侧Name栏选择一项,观察右侧Headers->General->Request URL,即为请求的URL(对应一个网址)。“?”后面的就是参数,参数之间以”&”隔开。
浏览器请求URL地址对应的响应
在下图Elements里的元素就是浏览器得到的响应。
浏览器请求URL地址过程:当服务器响应之后(network下找到对应的地址->response),这些字符串被渲染显示到屏幕上,但是浏览器会发现响应字符串中有很多URL地址,紧接着又会请求,于是就会显示很多Elements。 但是爬虫的话不会得到这么多Elements,只会得到一个服务器返回的响应。
总结如下:浏览器请求url地址,得到elements下面的内容(当前url地址对应的响应 + 图片 + css + js)。 爬虫请求url地址,得到当前url地址对应的响应(network–>reponse或者查看网页源码的内容)
HTTP与HTTPS
HTTP:超文本传输协议。明文传输的(数据不加密直接传输)
HTTPS:HTTP+SSL(安全套接字层)。以密文传输的,传输的数据是经过加密的,接收方需经过解密之后才能得到加密前的数据。
因此HTTP的效率要高于HTTPS,但是不安全。
请求行
请求行就是General中的内容
Request URL:请求的url。
Request Method:请求的方式。 get或者post方式
Status Code:状态码。返回200表示正确
Referrer Policy:表示你是哪里进入这个页面的
请求头
点击view source
主要参数:
GET:表示是get方式请求的,后面的值是路径和参数 。
connection:keep-alive。 表示可以建立常链接 。
Cache-Control:缓存控制。max-age=0 表示不缓存任何东西 。
User-Agent(重要):用户代理。服务器得知是谁在请求它,什么平台下的什么版本浏览器,或者程序 。
Cookie(重要):用来存储用户信息,每次请求都会发送给对方浏览器。 访问需要登录的页面时,对方会根据Cookie来判断是不是爬虫。
请求体
请求体是携带数据的,get请求没有请求体,post请求有请求体。get请求的携带的数据直接通过参数给出了。 post请求常用于登陆注册 ;post请求携带的数据量比get请求大与多,常用于传输大文本的时候。
响应头
主要看Set-Cookie字段:对方服务器通过该字段设置cookie到本地。
抓包
指在network里面查找需要的东西的过程。
(二)requests库
Python中的一个HTTP网络请求库,用来简化网络请求!
常见reponse方法:
response.text:打印返回的数据
response.content:打印返回的数据
response.status_code:返回状态码
response.request,headers:返回请求头
response.headers:返回响应头
#1 爬取第一个网页
import requests
url = "http://www.baidu.com"
response = requests.get(url) # get请求(数据从服务器发到客户端)
response.encoding = "utf-8" # 修改编码格式
print(response.status_code) #状态码(200表示一切正常)
assert response.status_code == 200
print(response.request.url) # 请求url
# print(response.url) # 响应url(结果同上)
print(response.request.headers) #请求头1
print(response.headers) #请求头2
print(response.text) #返回的数据
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
response = requests.get("http://www.baidu.com", headers=headers) # 加入请求头
print(response.content.decode()) # 响应内容(内容更完整,结果未贴)
200
http://www.baidu.com/
{'User-Agent': 'python-requests/2.19.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sun, 18 Aug 2019 14:02:14 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:12 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
# 2 发送带参数的请求
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
p={"wd":"传智播客"}
url_temp="http://www.baidu.com/s"
# url="http://www.baidu.com/s?wd={}".format("传智播客") # 可代替(即合并搜索参数)
# r=url.get(url, headers = headers) # 可代替
r=requests.get(url_temp, headers = headers, params=p)
print(r.status_code)
print(r.request.url) #地址被url编码
http://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2
传智播客(URL解码结果)
说明:本文是从《python项目案例开发从入门到实战》书中总结而来,如有疑问,还望各位同仁与前辈指正。