wjx-2005-07-01  

爬虫基础

一、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元 / 平装
======================

posted on 2024-01-15 17:08  星辰与Python  阅读(38)  评论(0编辑  收藏  举报