如果将互联网比作一张大的蜘蛛网,数据便是存放在蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序。
爬虫能通过网址获得网络中的数据、然后根据目标解析数据、存储目标信息,可以节省大量的人力物力,简单地说,网络爬虫就是获取互联网公开数据的自动化工具,像百度、google本质上就是超级爬虫,百度搜索引擎的爬虫叫作百度蜘蛛(Baiduspider)。百度蜘蛛每天会在海量的互联网信息中进行爬取,爬取优质信息并收录,当用户在百度搜索引擎上检索对应关键词时,百度将对关键词进行分析处理,从收录的网页中找出相关网页,按照一定的排名规则进行排序并将结果展现给用户。
网络爬虫,基本原理就是在爬虫程序得到URL(链接),向目标服务器发起HTTP请求访问,然后目标服务器返回响应结果,爬虫客户端收到响应并从中提取数据,再进行数据清洗、数据存储工作。
爬虫要向URL发送请求,那么就要依赖于HTTP/HTTPS协议,HTTPS比HTTO更安全,但性能更低
HTTP(Hypertext Transfer Protocol)协议又称超文本传输协议,它是一种客户端与服务器之间的请求-响应协议,比如 浏览器就是可以被看作客户端,在浏览器地址栏输入想访问的网址,浏览器就会向该链接的服务器发送访问请求,然后等待服务返回给浏览器响应
HTTP有不同的请求方法,最常见的两种是GET和POST
一个完整的HTTP请求数据里面包含三部分类容:请求行、请求头、请求体
请求行
在以上URL请求链接中www.douban.com域名后的第一个斜杠表示资源路径的根,所以/movie/top250就是要访问的资源路径,在请求行中可以添加查询参数,可以传递给服务器额外的信息。请求行中的HTTP/1.1表示HTTP的协议版本
请求头
用于告知客户端的相关信息,比如请求时浏览器发出的还是其它程序发出来的,如果是浏览器的话则展示类型、版本等等信息
请求体
请求体里面可以放客户端传给服务器的其它任意数据,但get方法的请求体一般是空的
以下使用的作为示范的编译器是PyCharm
引入第三方库
首先引入requests与bs4的第三方库
引入requests
requests是Python中可以用代码来模拟发送网络请求,并得到响应数据的一个第三方库requests
在终端(terminal)输入:pip install requests
显示此信息表示安装成功
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循环遍历了,敲几遍很好理解