爬虫
1.基本概述
爬虫一定要用Python吗?不一定,用Java、C也可以,编程语言只是工具,抓到数据才是目的。为什么选择python,因为python简单好用!爬虫指的是通过请求,获取相关数据、图片、视频、音频等等。
爬虫:通过编写程序来获取到互联网的资源
#百度
#需求:用程序模拟浏览器,输入一个网址,从该网址中获取资源或者内容
#python搞定以上需求,非常简单
#1.导入request包中的urlopen
from urllib.request import urlopen
url = "http://www.baidu.com"
#2.返回为resp
resp = urlopen(url)
#运行后的b'代表字节
with open("mybaidu.html",mode="w",encoding="utf-8") as f:
f.write(resp.read().decode("utf-8"))#读取到网页的源代码
print("end!")
2.爬虫合法吗?
爬虫有性质之分。首先,爬虫在法律上是不被禁止的,但是爬虫也具有违法风险,就像一把双刃剑一样。要看使用者怎么去使用了。
爬虫分为善意的爬虫和恶意的爬虫
* 善意的爬虫,不破坏被爬取网站的资源,可以正常访问,不窃取用户的隐私信息。
* 恶意的爬虫,影响网站的正常运营(抢票,秒杀,疯狂solo网站资源造成网站宕机)。
3.爬虫的矛与盾
反爬机制
门户网站,可以通过制定相应的策略或技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略
爬虫程序可以通过制定相关的策略或技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。
robots.txt协议:
君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取。
HTTP协议
协议:就是两个计算机之间为了能够通畅地进行沟通而设置的一个君子协定,常见的协议有TCP/IP、SOAP协议,HTTP协议、SMTP协议等等。
HTTP协议:Hype Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW.World Wide Web)服务器传输超文本到本地浏览器的传送协议,直白点,就是浏览器和服务器之间的数据交互遵守的就是HTTP协议。
#1.服务器渲染:在服务器那边直接把数据和html整合在一起,统一返回给浏览器。 #在页面源代码中,看得到数据 #2.客户端渲染:第一次请求只要一个html骨架,第二次请求拿到数据,进行数据展示。 # 在页面源代码中,看不到数据 #熟练使用浏览器抓包工具
HTTP协议把一条信息分为三大内容,无论是请求还是响应都是三块内容。
请求:
1 请求行 -> 请求方式(get/post 请求url地址 协议
2 请求头 -> 放一些服务器要使用的附加信息
3 请求体 -> 一般放一些请求参数
响应:
1 状态行 -> 协议 状态码
2 响应头 -> 放一些客户端要使用的一些附加信息
3 响应体 -> 服务器返回的真正客户端要用的内容(HTML、json)等
在我们后面写爬虫的时候要格外注意请求头和响应头,这两个地方一般都隐含着比较重要的内容
请求头中最常见的一些重要内容(爬虫需要的):
1.User-Agent:请求载体的身份标识(用啥发送的请求)
2.Referer:防盗链(这次请求是从哪个页面来的?反爬会用到)
3.cookie:本地字符串数据信息(用户登录信息)
响应头中一些重要的内容:
1.cookie:本地字符串数据信息(用户登录信息,反爬的token)
2.各种神奇的莫名其妙的字符串(这个需要经验了,一般都是token字体,防止各种攻击和反爬)
请求方式:
GET:显示提交
POST:隐示提交
爬虫两种方式:
1.导包urllib中的urlopen
2.使用requests包(简洁版)
例一:
#安装requests
#pip install requests
import requests
query = input("输入一个你喜欢的明星:")
url = f"https://www.sogou.com/web?query={query}"
dic = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.68"}
resp = requests.get(url,headers=dic)#处理一个小小的反爬
print(resp)
print(resp.text)#拿到页面源代码
例二:
import requests
url = "https://fanyi.baidu.com/sug"
s = input("请输入你要翻译的英文单词")
data = {
"kw":s
}
#发送post请求,发送的数据必须放在字典中,通过data参数进行传递
resp = requests.post(url,data=data)
print(resp.json())#将服务器返回的内容直接处理成json() ==>字典dict
例三:
import requests
url = "https://movie.douban.com/j/chart/top_list"
#重新封装参数
param = {
"type": "24",
"interval_id": "100:90",
"action":"",
"start": 0,
"limit": 20
}
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.68"}
resp = requests.get(url=url,params=param,headers=header)
print(resp.json())