爬虫基础
一、HTTP与HTTPS的基本原理
任何一个网页的开头都指明了协议,一般协议的开头都是HTTP或者HTTPS。
协议指的就是数据传输协议,也就是数据的传输格式。只要客户端和服务端都遵循这些规范,就可以正常传输数据。
那么HTTP与HTTPS的区别是什么?
主要就是HTTPS传输的数据都是加密的,而通过HTTP传输的数据都是明文,容易获得。
HTTPS的安全基础是SSL,即通过SSL进行加密。
二、HTTP的请求过程(request)
在浏览器的地址栏输入一个URL(地址),然后会在浏览器中显示网页的内容。实际上,当我们按下enter键后,相当于向服务端发送了一个请求,当服务端接受到这个请求后,会对请求的数据进行解析,并且处理解析后的数据,这些响应数据就会被回传给浏览器。
注意:响应的数据源代码其实时HTML代码,但是浏览器啊会对这些代码进行解析,然后将解析结果呈现在浏览器上,这才是我们最终看到的页面。
2.1、请求的方法
请求的方法有很多种,但较为普遍的请求的方法是GET和POST方法。
在这里,我就浅说一下这两个方法的区别。
GET请求的参数都会包含在URL中;而POST的请求提交的数据并不会包含在URL中,这些数据会包含在请求体中提交给服务端。例如,当我们访问一个应用时,有时需要登录,那么这个登录的信息就不会包含在URL中。
2.2、请求的链接
即URL,用于指定请求的唯一资源,URL被称为“统一资源定位符”,就是唯一定位该资源。
2.3、请求头
我在这里举一些常见的请求头
- Cookie:存储本地的数据,通常以键值对的形式存储。cookie用于跟踪客户端。由于HTTP是无状态连接,也就是说,一旦你退出这个网页,客户端与服务端就会立刻断开连接。例如,有些网站我们每一次进入的时候都需要登录,但是有些网站我们登录一次后就可以免登录,这是因为有些网站我们登录第一次的时候,会从服务端获得唯一标识该用户的值,并且将这个标识保存在Cookie文件中。
- Host:服务端的域名和端口号。
- Referer:用来标识这个请求是从哪个页面发出来的,服务器可以用这些信息作相应的处理
- User-Agent:用于表示客户端的操作系统和浏览器版本。
2.4、请求体
简单来说,请求体就是我们需要上传的内容。
三、响应(response)
服务端返回给客户端的数据称为响应
响应分为三部分
- 响应状态码:例如,200为正常响应;404表示找不到请求资源等等
- 响应头:服务器对请求的应答信息
- 响应体:响应体式服务端对客户端具体的响应数据。例如,客户端请求的是web页面,那么响应体会包含HTML格式的数据;如果是图像,那么响应体会包含二进制数据。
四、网页的基础
静态网页:如果只用HTML和CSS对网页进行设置,那么这个网页被称为纯的静态网页
动态网页:绝大多数网页还有JavaScript的参与,使得很多数据都是动态设置的。
动态页面给爬虫爬取数据带来了一定的困难。
提醒:在学习爬虫前,大家需要对HTML和CSS还有JavaScript有一定的了解
接下来我将练习爬取一个简单的网站(豆瓣图书:https://book.douban.com/latest?icn=index-latestbook-all)
#urllib是python内置的HTTP请求库
from urllib import request
#导入正则
import re
#导入requests请求,获得图片的内容
"""
其实,request的功能更加强大。
但是,学习爬虫首先我们需要了解urllib,这是基础模块
requests需要手动下载,这里为了获得图片的信息,才导入了requests模块
"""
import requests
#导入os,可以获取文件路径,创建文件
import os
#定义了一个爬虫类
class DouBanSpider:
#首先指定路径
os_path = os.getcwd()+'/豆瓣读书/'
#判断路径是否存在,若不存在,则创建文件
if not os.path.exists(os_path):
os.mkdir(os_path)
#初始化类的对象
def __init__(self):
#设置请求头
self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
#定义一个函数,获取网页的HTML代码
def get_html(self):
#通过观察URL,可以发现不同的页面只有后面的数据改变,这里获取1~9页的数据
for i in range(1,10):
url = f'https://book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8&p={i}'
#创建request对象
res = request.Request(url=url,headers=self.headers)
#向服务端发送请求
response = request.urlopen(res)
#读取网页源代码
html = response.read().decode('utf-8')
self.parse_html(html)
#解析源代码函数
def parse_html(self,html):
#使用正则表达式,获取相关的数据
"""
提醒:正则表达式看起来非常的复杂,后面我们还会学习到很多其他的解析语法
如xpath、Beautifulsoup、jsonpath等等
"""
z = '<li\sclass="media\sclearfix">.*?<img\sclass="subject-cover".*?src="(.*?)"/></a>.*?<a\sclass="fleft"\s' \
'href="(.*?)">(.*?)</a>.*?<p\sclass="subject-abstract color-gray">(.*?)</p>'
#获取表达式的内容
data_list = re.findall(z,html,re.S)
for data in data_list:
img_url = data[0]
link = data[1]
name = data[2]
author = data[3].strip()
#图片链接
print(img_url)
#详情链接
print(link)
#书本名称
print(name)
#作者名称
print(author)
print("======================")
self.save_data(img_url,link,name,author)
#保存数据
def save_data(self,img_url,link,name,author):
img = requests.get(img_url).content
with open(self.os_path+name+'.jpg','wb') as f:
f.write(img)
print(f'正在下载{name}的图片')
if __name__ == '__main__':
douban = DouBanSpider()
douban.get_html()
注意:这里只复制了部分内容,供大家参考。
https://img1.doubanio.com/view/subject/s/public/s34695708.jpg
https://book.douban.com/subject/35010165/
爱的知识:写在哲学与文学之间
玛莎·努斯鲍姆 / 2024-1 / 广西师范大学出版社 / 158.00元 / 精装
======================
正在下载爱的知识:写在哲学与文学之间的图片
https://img9.doubanio.com/view/subject/s/public/s34677666.jpg
https://book.douban.com/subject/36438836/
不做告别:济州岛大屠杀
(韩) 韩江 / 2023-12 / 九州出版社 / 58 / 精装
======================
正在下载不做告别:济州岛大屠杀的图片
https://img3.doubanio.com/view/subject/s/public/s34740803.jpg
https://book.douban.com/subject/36595895/
情感时代:18世纪西方启蒙思想与现代小说的兴起
金雯 / 2024-1-1 / 华东师范大学出版社 / 95.00元 / 精装
======================
正在下载情感时代:18世纪西方启蒙思想与现代小说的兴起的图片
https://img1.doubanio.com/view/subject/s/public/s34746918.jpg
https://book.douban.com/subject/36373952/
写下来,痛苦就会过去
[英]弗吉尼亚·伍尔夫 著 / [英]伦纳德·伍尔夫 编著 / 2024-1 / 中信出版社 / 98.00元 / 套装
======================
正在下载写下来,痛苦就会过去的图片
https://img9.doubanio.com/view/subject/s/public/s34719184.jpg
https://book.douban.com/subject/36602176/
反抗绝望:鲁迅及其文学世界(修订本)
汪晖 / 2024-1 / 生活·读书·新知三联书店 / 98.00元 / 精装
======================
正在下载反抗绝望:鲁迅及其文学世界(修订本)的图片
https://img1.doubanio.com/view/subject/s/public/s34700898.jpg
https://book.douban.com/subject/36157223/
时空文化:1880—1918
[美]斯蒂芬·科恩 / 2024-1 / 南京大学出版社 / 88 / 平装
======================
正在下载时空文化:1880—1918的图片
https://img9.doubanio.com/view/subject/s/public/s34755864.jpg
https://book.douban.com/subject/36255875/
历史
[法]克洛德·西蒙 / 2024-1 / 南京大学出版社 / 82.00 / 精装
======================
正在下载历史的图片
https://img3.doubanio.com/view/subject/s/public/s34636013.jpg
https://book.douban.com/subject/36544421/
中国妆束:宋时天气宋时衣
左丘萌 / 末春 / 2024-1-1 / 清华大学出版社 / 149 / 精装
======================
正在下载中国妆束:宋时天气宋时衣的图片
https://img1.doubanio.com/view/subject/s/public/s34732438.jpg
https://book.douban.com/subject/36696538/
超越百岁:长寿的科学与艺术
彼得 · 阿提亚(Peter Attia) / 比尔 · 吉福德(Bill Gifford) / 2024-1 / 中译出版社 / 98.00元 / 平装
======================