一,爬虫概述
网络爬虫,顾名思义,它是一种顺着url爬取网页数据的自动化程序或者脚本。可以认为地,我们给予爬虫一个网站的url,它就会返回给我们网站的源代码,我们通过正则表达式来筛选我们需要的内容数据,这就是爬虫的目的,而所谓的反爬和反反爬策略只是这个过程的障碍与应对。
反爬机制:门户网站对爬虫的应对策略,防止爬虫对网站的数据进行爬取。
反反爬策略:对反爬机制的应对策略
Robots.txt:该文件规定了网站哪些数据是否允许爬取。
from urllib.request import urlopen url="http://www.baidu.com" response = urlopen(url) print(response.read().decode("utf-8"))#拿到的是页面源代码
上述代码就是最简单的爬虫,获取到url后返回给我们网页的源代码(页面源代码html,css,js,在浏览器中,浏览器会对代码进行渲染。)
二,Web请求过程
客户端向服务端发送请求,服务端接收到请求后进行判断,允许后进行html拼接,然后返回给客户端,客户端浏览器对html文件进行渲染形成我们所看见的页面。
实际情况中,网站通常会采用分布式,即将html文件和数据分开来返回给客户端,这样可以把服务器的压力分摊,当访问人数过多时不至于服务器宕机。
三,HTTP协议
HTTP协议(Hyper Text Transfer Protocol超文本传输协议),是用于从万维网传输超文本到本地浏览器的传送协议。
请求:
1.请求行 -> 请求方式(get/post) 请求url地址 协议
2.请求头 -> 放一些服务器要用的附加信息
3.
4.请求体 -> 放一些请求参数
响应:
1.状态行 -> 协议 状态码
2.响应头 -> 放一些客户端要使用的一些附加信息
3.
4.响应体 -> 服务器返回的真正客户端要用的内容
四,Requests模块
安装requests模块:
pip install requests
Import requests #爬取百度源代码 url="http://www.baidu.com" res=requests.get(url)#[Response200]200是状态码,没问题 print(res.content.decode('utf-8'))#拿到源代码 Import requests content=input("输入你要检索的内容") url=f"https://www.sogou.com/web?query={content}" response=requests.get(url) print(response.text)
编辑
我们发现,我们发送的请求被验证拦截下来了,这是因为我们发送请求的请求头不是设备的型号,而是python的型号,这被服务端识别并拦截。
importrequests content=input("输入你要检索的内容") headers= {"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.0.0Safari/537.36Edg/124.0.0.0"} url=f"https://www.sogou.com/web?query={content}" response=requests.get(url,headers=headers) print(response.text)
我们模拟了设备的请求头,再次发送,成功骗过服务端,获取到数据。
五,Post请求
我们打开百度翻译,调成英文输入法,打开network观察XHR(ajax请求)
看得出来,表单数据放在了XHR文件中而没有拼接在url上,所以说post是一种隐式提交,get是显式提交
import requests import json headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.0.0Safari/537.36Edg/124.0.0.0"} url="https://fanyi.baidu.com/sug" data={ "kw":input("请输入一个单词") } response=requests.post(url,data=data) response=json.loads(response.text) print(response)
输出结果:
{'errno': 0, 'data': [{'k': 'happy', 'v': 'adj. 快乐的; 幸福的; 巧妙的; 〈口〉有点醉意的'}, {'k': 'Happy', 'v': '[人名] 哈皮; [地名] [美国] 哈皮'}, {'k': 'Happy Day', 'v': '新春如意(歌名)'}, {'k': 'happy lot', 'v': '福分;福气'}, {'k': 'happy home', 'v': '快乐家庭'}], 'logid': 2211867141}