目录

  • 一、爬虫是什么?
  • 二、爬虫的基本原理
  • 三、HTTP协议与响应
  • 4、爬虫实现源码


一、爬虫是什么?

如果将互联网比作一张大的蜘蛛网,数据便是存放在蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序。

爬虫能通过网址获得网络中的数据、然后根据目标解析数据、存储目标信息,可以节省大量的人力物力,简单地说,网络爬虫就是获取互联网公开数据的自动化工具,像百度、google本质上就是超级爬虫,百度搜索引擎的爬虫叫作百度蜘蛛(Baiduspider)。百度蜘蛛每天会在海量的互联网信息中进行爬取,爬取优质信息并收录,当用户在百度搜索引擎上检索对应关键词时,百度将对关键词进行分析处理,从收录的网页中找出相关网页,按照一定的排名规则进行排序并将结果展现给用户。

二、爬虫的基本原理

爬虫python源码 爬虫 源码_爬虫

网络爬虫,基本原理就是在爬虫程序得到URL(链接),向目标服务器发起HTTP请求访问,然后目标服务器返回响应结果,爬虫客户端收到响应并从中提取数据,再进行数据清洗、数据存储工作。

  • 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用;

三、HTTP协议与响应

爬虫要向URL发送请求,那么就要依赖于HTTP/HTTPS协议,HTTPS比HTTO更安全,但性能更低

HTTP(Hypertext Transfer Protocol)协议又称超文本传输协议,它是一种客户端与服务器之间的请求-响应协议,比如 浏览器就是可以被看作客户端,在浏览器地址栏输入想访问的网址,浏览器就会向该链接的服务器发送访问请求,然后等待服务返回给浏览器响应

爬虫python源码 爬虫 源码_httpx_02

HTTP有不同的请求方法,最常见的两种是GET和POST

  • GET方法用于获取数据,如向网页发送get请求得到网页类容
  • POST方法用于创建数据,如在浏览器中提交表单信息时,浏览器会发送POST请求

一个完整的HTTP请求数据里面包含三部分类容:请求行、请求头、请求体

请求行

爬虫python源码 爬虫 源码_开发语言_03

在以上URL请求链接中www.douban.com域名后的第一个斜杠表示资源路径的根,所以/movie/top250就是要访问的资源路径,在请求行中可以添加查询参数,可以传递给服务器额外的信息。请求行中的HTTP/1.1表示HTTP的协议版本

请求头

爬虫python源码 爬虫 源码_httpx_04

用于告知客户端的相关信息,比如请求时浏览器发出的还是其它程序发出来的,如果是浏览器的话则展示类型、版本等等信息

请求体

请求体里面可以放客户端传给服务器的其它任意数据,但get方法的请求体一般是空的

4、爬虫实现源码

以下使用的作为示范的编译器是PyCharm

引入第三方库

首先引入requests与bs4的第三方库

爬虫python源码 爬虫 源码_爬虫python源码_05

引入requests

requests是Python中可以用代码来模拟发送网络请求,并得到响应数据的一个第三方库requests

在终端(terminal)输入:pip install requests

显示此信息表示安装成功

爬虫python源码 爬虫 源码_爬虫_06


引入bs4

BeautifulSoup又称bs4,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据

在终端(terminal)输入:pip install bs4

显示此信息表示安装成功

爬虫python源码 爬虫 源码_爬虫python源码_07

编写简易爬虫

以下爬虫是扒取豆瓣电影Top250的信息

源码

import requests
from bs4 import BeautifulSoup

# 修改请求头中的User-Agent参数 以达到模拟用户访问的效果
headers = {
    "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.48"
}
# 循环判断 获取分页数据 从0-250 每次分页加25值
for start_num in range(0, 250, 25):
    # get方式请求链接 并扒取html数据
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
    html = response.text
    # 使用BeautifulSoup方法 获取html
    soup = BeautifulSoup(html, "html.parser")
    # 指定span标签
    all_title = soup.findAll("span", attrs={"class": "title"})
    # 循环html标签下的 span标签
    for title in all_title:
        # 声明索引值
        title_string = title.string
        # if判断 不趴取span标签中 含下滑线/
        if "/" not in title_string:
            # 打印索引值
            print(title_string)

以上爬虫代码扒的页面数据所以要观察 页面的html元素

进入https://movie.douban.com/top250链接 f12查看页面的html元素 选择到要扒的数据 可以看到

该条数据(肖申克的救赎)是在span标签里且class值为title的元素 然后用这些条件指定到该标签的值

soup.findAll(“span”, attrs={“class”: “title”})

爬虫python源码 爬虫 源码_python_08

分页扒取数据

在跳转下一页时观察 请求行的变化

爬虫python源码 爬虫 源码_python_09

可以看出多了 start=75 的请求参数,此请求参数不同则跳转的分页页面也不同

然后就是for循环遍历了,敲几遍很好理解