揭秘爬虫:从入门到精通
引言
一、初识爬虫
二、爬虫的种类
三、Python 爬虫入门
四、解析网页数据的技术
五、爬虫进阶技术
六、反爬虫策略与应对措施
结语
引言
爬虫,一个在数据科学和编程领域中颇具挑战性和魅力的主题,正逐渐受到越来越多人的关注。在这篇博客中,我们将一起探索爬虫的奥秘,从入门到精通,一步步揭开爬虫的面纱。
一、初识爬虫
爬虫,也称为网络爬虫,是一种自动抓取互联网信息的程序。它通过模拟人类浏览网页的行为,自动解析网页内容,并将所需数据保存下来。爬虫的主要应用场景包括数据挖掘、信息聚合、搜索引擎等。
视频来源:Python-阿巴阿巴
二、爬虫的种类
根据不同的分类标准,爬虫可以分为多种类型。按照抓取方式,爬虫可以分为聚焦爬虫和通用爬虫。按照使用技术,爬虫可以分为基于 Python 的爬虫、基于 Java 的爬虫等
三、Python 爬虫入门
Python 作为一门易于上手、功能强大的编程语言,是爬虫开发的首选语言。在 Python 中,我们可以使用诸如 requests、BeautifulSoup 等库来轻松实现网页抓取。
除了使用python爬虫外还可以使用八爪鱼爬取需要的数据
自学:八爪鱼采集器官网学习
https://www.bazhuayu.com/search?query=%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
浏览器加载网页的过程:

爬虫爬取一个网站的基本框架:
(一)请求对象的定制
(二)获取响应的数据
(三)读取内容
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
# 获取响应的数据
response = urllib.request.urlopen(request)
# 读取内容
content = response.read().decode('utf-8','ignore')
在讲代码之前先讲一下本人在使用python爬虫是遇到的一个小八哥:当我文件路径存在中文时,我们直接运行我们编好的代码会报错,只需要在头部加上:
# 文件夹路径有中文有进行编码方法有三种:
'coding=gbk'
'coding=gb2312'
'coding=UTF-8'
如果这三种都不行那就将等于号两边空格
(一)请求对象的定制
1.网址:URL
URL(Uniform Resource Locator)中文名是统一资源定位符,简单来说它是互联网上标准资源的地址,但是它的结构比较特殊,不完全像地理上我们用来表示地理位置的地址。通过它我们可以获取到我们需要的资源(比如:网页、图片、音视频、服务,文件等)。
# url 的组成
# https://www.baidu.com/s?wd=周杰伦
# http/https www.baidu.com 80/443 s wd=周杰伦 #
# 协议 主机 端口号 路径 参数 描点
2.请求头:headers
headers指的是HTTP请求和响应中的元数据,包括了请求头(request headers)、响应头(response headers)和实体头(entity headers)三种类型。其中,请求头用于向服务器发送请求时提供额外信息;响应头则包含服务器对请求所做出的响应信息;实体头则包含有关实体正文特定部分的信息。
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
}
(二)获取响应的数据
1.使用到urllib库
urllib库是Python内置的HTTP请求库,它可以看做是处理URL的组件集合。

使用urllib库快速爬取itcast网页
import urllib.request
#调用urllib.request库的urlopen方法,并传入一个url
response =
urlib.request.urlopen('http://www.baidu.com')
# .使用read方法读取获取到的网页内容
html = response.read).decode('UTF-8')
#打印网页内容
print(html)
2.分析urlopen方法
urlopen方法可以接收多个参数,定义格式如下:
urllib.request.urlopen(url, data= None, [timeout, ]*, cafile= None,capath= None, cadefault= False, context=None)
参数如下:
➢url --表示目标资源在网站中的位置。
➢data --用来指明向服务器发送请求的额外信息。
➢timeout一该参数用于设置超时时间,单位是秒。
➢context一实现SSL加密传输,该参数很少使用。
3.构造Request对象
在构建请求时,除了必须设置的url参数外,还可以加入很多内容,例如下面的参数
参数如下:
➢data -默认为空,该参数表示提交表单数据,同时HTTP请求方法将从默认的GET方式改为POST方式。.
➢headers --默认为空,该参数是-一个字典类型,包含了需要发送的HTTP报头的键值对。
更简便的requests库--以中国气象局天气预报为例
import pprint
import requests
url = "https://aqiapp.daqi110.com/report/cityinfo?city=%E6%9F%B3%E5%B7%9E&place=1"
response = requests.get(url) # get到网址
response.encoding = "utf-8"
result_html = response.text
result_data = response.json() # 获取网址对应的json数据
pprint.pprint(result_data)
print("城市:" + result_data['city'])
print("PM2.5:" + str(result_data['pm25']))
四、解析网页数据的技术
Python中提供了多种解析网页数据的技术,包括正则表达式、XPath 、Beautiful Soup、JSONPath 。
XPath是XML路径语言,用于从HTML或XML格式的数据中提取所需的数据。XPath适合处理层次结构比较明显的数据,它能够基于HTML或XML的节点树确定目标节点所在的路径,顺着这个路径便可以找到节点对应的文本或属性值。
1.XPath语法:

2.实例:

from lxml import etree
# xpath解析
#(1) 本地文件 etree.parse
#(2) 服务器响应的数据 response.read()decode('utf-8')*****应用比较多 etree.HTML()
# xpath解析本地文件
tree = etree.parse('解析——xpath基本使用.html')
# tree.xpath('xpath路径')
# (1) 查找UL下面的LI
li_list = tree.xpath('//body//ul/li')
# 谓词查找//内容查找
# (1) //div[@id]
# text() 获取标签中的内容
# 查找所有id的属性的li标签
li_list = tree.xpath('//ul/li[@id]/text()')
# (2) //div[@id="l1"]
# 查找id为l1的Li标签
li_list = tree.xpath('//ul/li[@id="l1"]/text()')
# 属性查找
# (1) //@class
# 查找到id为l1标签的class属性值
li_list = tree.xpath('//ul/li[@id="l1"]/@class')
# 模糊查找
#(1)[contains(@id,"he") ]
# 查找id的值以l开头的li标签
li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
# (2) [starts-with(@id,"he")]
# 查找id的值以c开头的li标签
li_list = tree.xpath('//ul/li[starts-with(@id,"c")]/text()')
# 逻辑运算
# (1) and 与
# 查找id为l1和class为c1的数据
li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
#(2) | 或
li_list = tree.xpath('//ul/li[@id="l1" ]/text() | //ul/li[@id="l2"]/text()')
五、爬虫进阶技术
掌握了基本爬虫技能后,我们可以进一步探索一些进阶技术。例如:
- 使用代理:为了避免被目标网站封禁 IP 地址,我们可以通过使用代理来隐藏我们的真实 IP 地址。实现分布式爬虫:代理IP可以与分布式爬虫结合,将爬取任务分散到多个IP地址和地理位置,提高爬虫的效率和稳定性。
# 一:浏览器向服务器发送请求 用handler 处理器三步完成
# (1)获取handler 对象
handler = urllib.request.HTTPHandler()
# (2)获取Opener对象
opener = urllib.request.build_opener(handler)
# (3) 调用open 方法
response=opener.open(request)
# 代理ip
proxies = {# 代理ip
'hrrp':'120.41.142.161:17223'
}
# handler build_request open
handler = urllib.request.ProxyHandler(proxies=proxies) # 代理ip ProxyHandler() 代理语法
opener = urllib.request.build_opener(handler)
response = opener.open(request)
- 使用数据库:为了更好地管理和查询抓取的数据,我们可以使用数据库来存储数据。当今互联网中的数据库主要分为两种:关系型数据库和非关系型数据库。
- ●关系型数据库是指采用关系模型(二维表格形式)组织数据的数据库系统,它由数据表
和数据表之间的关系组成,主要包含数据行、数据列、数据表、数据库4个核心元素。
●非关系型数据库也被称为NoSQL ( Not Only SQL )数据库,是指非关系型的、分布
式的数据存储系统。与关系型数据库相比,非关系型数据库无需事先为要存储的数据建
立字段,它没有固定的结构,既可以拥有不同的字段,也可以存储各种格式的数据。
“学青会记录数据”爬取与存储为列
import time
from pymongo import MongoClient
from selenium import webdriver
try:
# 数据库建表
client = MongoClient("localhost", 27017)
database = client["db_student_youth_games"] # 建数据库
collection = database['record'] # 建立学青会记录表
# 自动化准备前工作
driver = webdriver.Chrome()
url = " 写入网址"
driver.get(url)
time.sleep(1)
# 循环准备前工作,找到关键区域,是用谷歌xpath-helper测试
#关键点是,根据网页的规律,找到165行数据
records =
driver.find_elements_by_xpath('//[@id="Content"]/div/div/div/div/table/tbody/*')
record_jsons = []
di = 0
for record in records: # 对165行数据的各个字段,进行提取
id = id + 1
date = record.find_element_by_xpath('.//*[@class="date"]').text
align_center_status = record.find_element_by_xpath('.//*[@class="align_center
status"]').text
sprotItemName = record.find_element_by_xpath('.//*[@class="sprotItemName"]').text
newResult = record.find_element_by_xpath('.//*[@class="newResult"]').text
lastResult = record.find_element_by_xpath('.//*[@class="lastResult"][1]').text
location = record.find_element_by_xpath('.//*[@class="lastResult"][2]').text
persons = record.find_element_by_xpath('.//* [@class="persons"]').text.replace("\n", "")
# print(date, align_center_status, sprotItemName, newResult, lastResult, location, persons)
record_json = {
"id": id,
"date": date,
"align_center_status": align_center_status,
"sprotItemName": sprotItemName,
"newResult": newResult,
"lastResult": lastResult,
"location": location,
"persons": persons
}
record_jsons.append(record_json)
print(record_jsons)
insertmany = collection.insert_many(record_jsons)
except Exception as error:
print(error)
- 使用 Scrapy 框架:Scrapy 是一个用于构建网络爬虫的强大框架,可以帮助我们更快速地开发出功能强大的爬虫程序。
-
Scrapy框架架构图:

Scrapy框架中包含的组件:
( 1) Scrapy Engine (引擎) :负责Scheduler、Spiders、 Item Pipeline、Downloader这几个组件之间的通信,包括信号和数据的传递等。
(2) Scheduler (调度器) :负责接收Scrapy Engine发送过来的Requests (请求) ,并按照一定的方式进行整理排列和入队,在Scrapy Engine需要时再次将请求交还给ScrapyEngine。
(3) Downloader :负责下载由Scrapy Engine发送的所有Requests,并将其获取到的Responses (响应) 交还给Scrapy Engine,由Scrapy Engine交给Spiders进行处理。
(4) Spiders :负责处理所有Responses,从Responses中解析并提取Items封装的数据,并将需要跟进的URL提交给Scrapy Engine,再次进入Scheduler.
(5) Item Pipeline :负责处理Spiders中获取的Items封装的数据,并对这些数据进行后期处理,如详细分析、过滤存储等。
(6) Downloader Middlewares :位于Downloader和Scrapy Engine之间,可以自定义扩展下载功能的组件。
(7 ) Spider Middlewares :位于Spiders和Scrapy Engine之间,可以自定义扩展ScrapyEngine和Spiders中间通信的功能组件。
Scrapy框架运作流程:

Scrapy框架个组件之间的运作步骤:
(1) Scrapy Engine从Spiders中获取初始URL。
(2) Scrapy Engine将初始URL封装成Requests交给Scheduler。
(3) Scheduler将下一个Requests交给Scrapy Engine。
(4) Scrapy Engine将Requests通过Downloader Middlewares转交给Downloader。
(5)页面完成下载后,Downloader生成一 个该页面的Responses ,并将该Responses通过Downloader Middlewares交给Scrapy Engine。
(6) Scrapy Engine从Downloader中接收到Responses ,并通过Spider Middlewares转交给Spiders进行处理。
( 7 ) Spiders处理Responses,并将处理后的Items或新的Requests (比如在前面案例中看到的“下一-页”链接)交给Scrapy Engine。
(8) Scrapy Engine将处理后的Items交给Iltem Pipeline,将新的Requests交给Scheduler。
重复步骤(1) ~ (8),直到Scheduler中没有新的Requests为止。
六、反爬虫策略与应对措施
在抓取网页数据时,我们需要遵守一定的道德和法律规范,尊重目标网站的知识产权和隐私权。同时,为了避免被目标网站封禁 IP 地址或限制访问,我们需要了解一些常见的反爬虫策略与应对措施。例如:
- 设置合理的抓取频率:避免过于频繁地抓取目标网站,以免对其服务器造成过大压力。
import time
time.sleep(1) # 输入完成又缓一会儿
- 使用代理:通过使用代理来隐藏我们的真实 IP 地址,可以避免被目标网站轻易地识别和封禁。
设置代理池:
# 代理池能更高性能的保护我们的IP
import urllib.request
proxies_pool = [
{'hrrp':'120.41.142.161:17223'},
{'hrrp':'120.41.142.161:17223'},
]
import random # 实现代理池需要的包 random
proxies = random.choice(proxies_pool) # 实现代理池
- 伪装成浏览器:通过修改请求头信息,使我们的爬虫程序看起来像是一个正常的浏览器访问请求,从而避免被目标网站识别和拦截。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
# 还可以加上 'Cookie'
}
- 使用验证码:对于一些反爬虫措施较为严格的网站,我们可能需要通过输入验证码来证明我们不是机器人。此时可以使用第三方验证码识别服务或手动输入验证码来解决这个问题。
结语
通过本篇博客的介绍,相信你对爬虫有了更深入的了解。从入门到精通,从基础到进阶,让我们一起探索爬虫的奥秘,挖掘互联网中的宝藏!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)