爬虫分类主要分为两大板块
web爬虫(浏览器爬虫)
APP爬虫(手机端爬虫)
在这两大板块中又可以把爬虫归类为聚焦爬虫和通用爬虫
聚焦爬虫:针对某一个接口(url)抓取 -使用requests第三方库
通用爬虫:针对搜索引擎(百度,bing等)-使用scrapy、scrapy-redis框架
首先序言去一部分精选挑选的种子url
将这些url放入待抓取的url队列
从待抓取的url队列中取出待抓取的url,解析DNS,并且得到主机的ip,并将url对应的网页下载下来,存储进一下载网页库中。此外,见这些URL放进已抓取url队列
分析已抓取url队列中的URL,分析其中的其他URL,并将URL放入待抓取url队列,进入下一个循环
📌也可以这么描述四步基础流程:1.请求目标链接;2.获取响应内容;3.解析内容;4.存储数据;下面分别进行简单描述:
1.请求目标链接
发起一个带有header、请求参数等信息的Request,等待服务器响应;
2.获取响应内容
服务器正常响应后,Response的内容即包含所有页面内容(可以是HTML、JSON字符串、二进制数据(图片、视频)等等)
3.解析内容
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析;可能是Json字符串,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理……
4.存储数据
存储形式多样,可以存为文本,也可以存储到数据库,或者存为特定格式的文件;
我们在pycharm的Terminal终端,或者Anaconda终端可以运行
pip install requests
主要下载了一些依赖包
HTTP由两部分组成:请求与响应
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
📌爬虫中的请求:构造请求头→防止反爬(就是代码 请求失败)
我们要了解其中的请求方式、请求地址、请求头
下面给出一个网址中的请求
请求头hearder = {
Accept:请求数据类型(浏览器支持格式)
Accept-Encoding:请求数据的编码
Connection:链接方式
Cookie:在浏览器中的用户信息
Host:主机地址
User-Agent:浏览器类型(电脑信息、浏览器信息)
Referer:防盗链接(请求一个网站,验证你是从哪里来的)
}
请求方式:HTTP请求可以使用多种请求方法
GET和POST方法区别归纳如下几点:
GET是从服务器上获取数据,POST是向服务器传送数据。
GET请求参数显示,都显示在浏览器网址上,POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送
尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。但是在分页程序中,用Get方式就比用Post好。
Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE.
一个URL地址用于描述一个网络上的资源.而HTTP中的GET,POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
爬虫中的响应:
数据:HTML、JS、CSS
响应头
响应状态码可以看一下这个blog
响应状态码
使用下面的代码进行导入
#导入requests库
import requests
一些常用的命名
requests.Request() # 请求类
requests.request() # 请求函数
requests.get() # 常用 session.request
session.request(实例) # 实例
最常用的命令是,我们可以通过help查看
#发送一个get请求并得到响应
r = requests.get('https://www.baidu.com')
help(requests.get)
我们可以看到使用get()函数,传递的参数
通过print操作还可以返回状态码,或者一些其他的操作
# ----------------------------------
#发送一个get请求并得到响应
r = requests.get('https://www.baidu.com')
#查看响应对象的类型
print(type(r))
#查看响应状态码
print(r.status_code)
#查看响应内容的类型
print(type(r.text))
#查看响应的内容
print(r.text)
#查看cookies
print(r.cookies)
我们通过解析可以返回的数据:text (返回字符串,不带解码功能)、 content(返回16进制数据) 、 content.decode() 、json,包括状态码、请求头等相关参数的反馈
这里调用了get( )方法实现urlopen( )相同的操作,结果返回一个响应对象,然后分别输出响应对象类型、状态码、响应体内容的类型、 响应体的内容、Cookies。通过运行结果可以得知:响应对象的类型是requests.models.Response,响应体内容的类型是str,Cookies 的类型是RequestCookieJar。如果要发送其他类型的请求直接调用其对应的方法即可:
url = 'https://www.bilibili.com/'
print(requests.get(url))
# -----------------------
# 运行结果
print(requests.get(url).text)
# -----------------------
# 运行结果
哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
print(requests.get(url).content.decode('utf-8')) #这个也能完成相同操作
# -----------------------
# 运行结果
哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
这里找了一张图像的链接地址,我们可以看到他的返回是一串16进制
url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F2018-06-27%2F5b3345789ca2c.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672394670&t=14a6fb6eea7ec009b16745f4a56bb9ff'
print(requests.get(url,headers=headers).content)
打开F12,刷新页面之后找到User-Agent,可以对静态页面进行反爬
# 请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
print(requests.get(url,headers=headers).content.decode('utf-8'))
运用这种方法可以在pycharm中看到较为格式化的参数
请求对象:requset.headers
print(requests.get(url,headers=headers).request.headers)
# 返回内容如下
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
请求地址:request.url
print(requests.get(url,headers=headers).request.url)
# 返回内容如下
https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F2018-06-27%2F5b3345789ca2c.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672394670&t=14a6fb6eea7ec009b16745f4a56bb9ff
请求方法:request.method
print(requests.get(url,headers=headers).request.method)
# 返回内容如下
GET
状态码:status_code
print(requests.get(url,headers=headers).status_code)
# 返回内容如下
200
响应头部:headers (与请求头部区分)
print(requests.get(url,headers=headers).headers)
# 返回内容如下
{'Server': 'JSP3/2.0.14', 'Date': 'Wed, 30 Nov 2022 10:17:49 GMT', 'Content-Type': 'image/jpeg', 'Content-Length': '111412', 'Connection': 'keep-alive', 'Expires': 'Mon, 26 Dec 2022 02:48:20 GMT', 'Last-Modified': 'Wed, 07 Jan 1970 00:00:00 GMT', 'ETag': '829a82d1de66e50d1fe6000f856e5d2f', 'Age': '265527', 'Accept-Ranges': 'bytes', 'Access-Control-Allow-Origin': '*', 'Ohc-Global-Saved-Time': 'Sat, 26 Nov 2022 02:48:20 GMT', 'Ohc-Upstream-Trace': '36.156.185.60', 'Ohc-Cache-HIT': 'sq2cm60 [2], csix73 [2]', 'Ohc-Response-Time': '1 0 0 0 0 0', 'Ohc-File-Size': '111412', 'X-Cache-Status': 'HIT', 'Timing-Allow-Origin': '*'}
浏览器信息:cookies 返回的是一种cookies对象而不是浏览器中的值
print(requests.get(url,headers=headers).cookies)
# 返回内容如下
返回请求方法:request
print(requests.get(url,headers=headers).request)
# 返回内容如下
返回编码方式:encoding
url = 'https://www.baidu.com/'
print(requests.get(url,headers=headers).encoding)
# 返回内容如下
utf-8
一些关于requests的更具体的应用我们可以看下面的文章
requests应用