1.爬虫的矛与盾
反爬机制:网站可以通过制定相应的策略或者技术手段,防止爬虫进行网站数据的爬取
反反爬策略:爬虫程序可以通过制定相关的策略或者技术手段,破解网站中具备的爬虫机制,从而可以获取网站中相关的数据。
robots协议:君子协议,规定了网站中那些页面可以被爬虫,哪些不行
根据协议,网站管理员可以在网站域名的根目录下放一个robot.txt的文本文件,里面可以指定不同的网络爬虫能访问的页面和禁止的页面。网络爬虫采集这个网站之前,可以先或者这个文件,然后解析里面的规则,最后根据规则来采集网页数据
例如:https://www.bilibili.com/robots.txt
2.web请求全过程剖析
浏览器输入网址到我们看到整个页面的过程:
以百度为例。在访问百度的时候,浏览器会把这次的请求送到百度服务器(百度的一台电脑),由服务器收到这个请求,然后加载一些数据,返回给浏览器进行显示。这里百度返回给浏览器的不是直接的页面,而是页面源代码(由html,css,js组成)。由浏览器执行页面代码,然后展示给用户。具体过程如下
是否所有数据都在页面源代码中?否,这边介绍下网页渲染过程:
第一种:服务器渲染
就是我们请求到服务器的时候,服务器吧全部数据写入到html中,我们浏览器就能能拿到带有数据的html内容。
如下:
由于数据直接写在html中,我们能看到的数据都在页面源代码中。这种网页一般都相对容器抓取。
第二种:客户端渲染(前端js渲染)
这种机制一班是第一次请求服务器返回一堆HTML框架结果。然后再次请求到真正保存数据的服务器,由这个服务器返回数据,最后在浏览器上对数据进行加载。
这样做的好处就是服务器那边能缓解压力,而且分工明确,容器维护。典型网页:https://www.jd.com/
那数据如何加载进来?其实我们向下滚动的过程中,js偷偷加载数据,要想看到这个页面的加载全过程,需要F12查看
看到了吧,⻚⾯上看到的内容其实是后加载进来的。
注意:有些时候,我们的数据不⼀定都是直接来⾃于⻚⾯源代码。如果你在⻚⾯源代码中找不到你要的数据时,那很可能数据是存放在另⼀个请求⾥。
3.HTTP协议
协议:就是2个计算机之间为了能流畅的进行沟通设置的君子协议。常见有TCP/IP,SOAP协议,HTTP协议,SMTP协议
HTTP协议:Hyper Text Transfer Protocol(超⽂本传输协议)的缩写,是⽤于从万维⽹(WWW:World Wide Web )服务器传输超⽂本到本地浏览器的传送协议。直⽩点⼉,浏览器和服务器之间数据交互遵守的就是HTTP协议。
HTTP协议把⼀条消息分为三⼤块内容。⽆论是请求还是响应都是三块内容:
请求:
请求⾏ -> 请求⽅式(get/post) 请求url地址
协议请求头 -> 放⼀些服务器要使⽤的附加信息
请求体 -> ⼀般放⼀些请求参数
响应:
状态⾏ -> 协议
状态码响应头 -> 放⼀些客户端要使⽤的⼀些附加
信息响应体 -> 服务器返回的真正客户端要⽤的内容(HTML,json)等
在后⾯我们写爬⾍的时候要格外注意请求头和响应头。这两个地⽅⼀般都隐含着⼀些⽐较重要的内容。
请求头常见的一些重要内容(爬虫需要):
user-agent:请求载体的身份标识(用啥发送请求)
Referer:防盗链(这次请求从哪个页面来的?反爬会用到)
Cookie:本地字符串数据信息(用户登录信息,反爬会用到)
响应头中一些重要的内容:
Content-Type:返回内容类型,比如Content-Type: text/html; charset=utf-8
各种神奇的莫名其妙的字符串(需要经验,一般都是token字样,防止各种攻击和爬虫)
请求方式:
Get:显示提交
Post:隐示提交
4.requests模块入门
我们使用python内置的urlib模块来获取页面源代码,但是他不是我们常用的工具。常用抓取页面通常用第三方模块requests。这个模块的优势就是比urlib还有简单,且处理各种请求比较方便。
安装:pip install requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
案例1:抓取搜狗内容
案例2:抓取百度翻译数据
注意百度翻译这个url不好弄出来。记住,在输⼊的时候,关掉各种输⼊法,要⽤英⽂输⼊法,然后不要回⻋。就能看到这个sug了。
案例3:抓取⾖瓣电影
学习这次的爬虫第一个课程知道了一些爬虫的基础知识,尤其对爬虫的渲染机制有了更深的理解。
task1:爬取新浪财经的数据
import requests
url = f'http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml'
dic = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"}
response = requests.get(url, headers=dic) # 处理一个小小的反爬
with open("xinlangcaijing.html", mode="w", encoding="utf-8") as f:
f.write(response.text)
response.close()
print("over")