python爬虫原理及源码解析(入门)

本文介绍了网络爬虫的基本概念,将其比喻为在互联网上抓取数据的小蜘蛛。爬虫通过HTTP协议向服务器发送请求,获取并解析HTML内容,提取所需数据。文中以Python的requests和BeautifulSoup库为例,展示了如何编写简单的爬虫程序来抓取豆瓣电影Top250的电影名称,并解释了如何通过改变请求参数实现分页数据的抓取。
摘要由CSDN通过智能技术生成

一、爬虫是什么?

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

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

二、爬虫的基本原理

在这里插入图片描述

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

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

三、HTTP协议与响应

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

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

在这里插入图片描述

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

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

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

请求行

在这里插入图片描述

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

请求头

在这里插入图片描述

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

请求体

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

4、爬虫实现源码

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

引入第三方库

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

在这里插入图片描述

引入requests

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

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

显示此信息表示安装成功

在这里插入图片描述
引入bs4

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

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

显示此信息表示安装成功
在这里插入图片描述

编写简易爬虫

以下爬虫是扒取豆瓣电影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”})

在这里插入图片描述

分页扒取数据

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

在这里插入图片描述

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值