一、Python 爬虫核心原理
爬虫本质是模拟浏览器向目标网站发送 HTTP 请求,获取网页响应数据(HTML/JSON 等),再从中提取所需信息(文字、图片链接等),最后将信息保存或进一步处理。
核心流程:
- 发送请求:向目标网站的 URL 发送 HTTP 请求(GET/POST 为主),获取响应;
- 解析响应:将返回的 HTML/JSON 数据解析成可提取的格式;
- 提取信息:从解析后的数据中筛选文字、图片链接等目标内容;
- 保存 / 处理:将提取的文字存为文件、图片下载到本地,或其他操作。
二、基础操作拆解(无代码,仅核心逻辑)
1. 打开指定网站(发送 HTTP 请求)
- 核心目标:获取目标网站的原始数据(HTML 源码)。
- 关键逻辑 :
- 模拟浏览器:网站会校验请求的 "身份"(User-Agent),需伪装成浏览器请求,避免被反爬拦截;
- 处理请求异常:如网站无法访问(404/500 错误)、网络超时等,需做异常判断;
- 编码处理:网页返回的内容可能有不同编码(如 UTF-8、GBK),需匹配编码才能正确解析。
2. 爬取文字
- 核心目标:从 HTML 源码中提取有效文字(排除广告、脚本、样式等无关内容)。
- 关键逻辑 :
- 解析 HTML:将杂乱的 HTML 源码转换成结构化的 "标签树",方便按标签 / 属性定位文字;
- 定位文字区域:通过网页的标签特征(如
<div class="content">、<p>、<h1>等),定位包含目标文字的标签; - 清理文字:去除提取后文字中的多余空格、换行、特殊符号,只保留有效内容;
- 可选操作:按需求筛选(如只提取标题、正文,排除导航栏 / 页脚文字)。
3. 爬取图片
- 核心目标:从 HTML 中提取图片链接,再下载图片到本地。
- 关键逻辑 :
- 提取图片链接:在 HTML 中找到
<img>标签,获取其src属性(图片的 URL),注意处理相对路径(需拼接网站域名成完整 URL); - 过滤无效链接:排除非图片链接(如 base64 格式的内嵌图片、广告图片);
- 下载图片:向图片链接发送独立的 HTTP 请求,获取图片的二进制数据,再将二进制数据写入本地文件(如.jpg/.png 格式);
- 保存管理:创建专门的文件夹存放图片,避免文件名重复、路径错误。
- 提取图片链接:在 HTML 中找到
三、核心工具 / 概念(Python 爬虫常用)
| 操作场景 | 核心工具 / 概念 | 作用 |
|---|---|---|
| 发送请求 | requests 库 | 简化 HTTP 请求的发送,处理请求头、超时、异常等 |
| 解析 HTML | BeautifulSoup 库 | 将 HTML 转换成标签树,支持按标签 / 类名 / 属性定位内容 |
| 处理图片路径 | URL 解析(urljoin/urlparse) | 拼接相对路径为完整图片 URL,解析 URL 中的文件名 |
| 保存数据 | 文件操作 | 文字存为.txt/.json 文件,图片以二进制形式写入.jpg/.png 文件 |
| 反爬规避 | 请求头伪装、延时请求 | 避免频繁请求被封 IP,伪装浏览器降低被拦截概率 |
四、注意事项
- 合规性:爬取前需确认网站的 robots 协议(是否允许爬取),避免爬取受版权保护的内容,不恶意高频请求(防止攻击网站);
- 反爬应对:部分网站会设置验证码、IP 封锁、Cookie 验证等,基础爬虫需适配简单反爬策略;
- 资源管理:下载图片时需控制并发数,避免占用过多网络资源,同时合理命名文件、管理存储路径。
获取网站允许爬虫的 "白名单"(即网站允许爬取的路径 / 内容范围),核心是查看网站的 robots.txt 协议文件 ------ 这是网站与爬虫之间的 "约定",明确告知哪些内容可爬、哪些不可爬,也是最权威的 "白名单 / 黑名单" 依据。以下是具体方法和相关细节:
一、核心方式:访问网站的 robots.txt 文件
1. 访问路径
所有合规网站的 robots.txt 都放在域名根目录下,格式为:https://目标域名/robots.txt
举例:
- 百度:https://www.baidu.com/robots.txt
- 知乎:https://www.zhihu.com/robots.txt
- 淘宝:https://www.taobao.com/robots.txt
直接在浏览器地址栏输入该 URL,即可查看网站的爬虫规则。
2. 解读 robots.txt 规则(白名单核心)
robots.txt 采用简单的文本规则,核心字段如下,重点关注 Allow(白名单)和 Disallow(黑名单):
| 字段 | 含义 |
|---|---|
User-agent |
针对的爬虫标识(* 代表所有爬虫) |
Allow |
允许爬取的路径(白名单),优先级高于 Disallow |
Disallow |
禁止爬取的路径(黑名单) |
Sitemap |
网站的站点地图(可选),里面会列出网站的核心页面,也是 "推荐爬取" 范围 |
示例(简化版百度 robots.txt):
plaintext
User-agent: *
Disallow: /baidu
Allow: /baidu.html
Allow: /s?
Disallow: /cache
Sitemap: https://www.baidu.com/sitemap.xml
解读:
- 所有爬虫(
*)禁止爬取/baidu、/cache路径; - 允许爬取
/baidu.html、/s?路径(白名单); - 推荐爬取
sitemap.xml里列出的页面。
3. 关键注意点
- 路径规则 :
/代表根目录,/xxx/代表 xxx 目录下所有内容,/xxx.html仅指定该文件; - 优先级 :
Allow优先级 >Disallow(即如果某路径同时出现在 Allow 和 Disallow,以 Allow 为准); - 特殊爬虫 :部分网站会为特定爬虫(如百度蜘蛛、谷歌爬虫)单独设置规则,若你是自定义爬虫,以
User-agent: *对应的规则为准。
二、补充方式:查看网站的 Sitemap(站点地图)
很多网站会在 robots.txt 里附上 Sitemap 链接(如 https://xxx.com/sitemap.xml),这是网站主动提供的 "核心页面清单",相当于 "官方推荐爬取的白名单"。
访问该 Sitemap 链接,能看到网站整理的所有重要 URL(如文章、产品页面),这些都是网站允许 / 推荐爬取的内容。
三、特殊情况:无 robots.txt 或规则模糊
-
无 robots.txt 文件 :若访问
域名/robots.txt返回 404,说明网站未设置爬虫规则,不代表 "允许爬取所有内容",仅代表无明确约定,此时需遵循 "谨慎爬取" 原则(避免高频请求、不爬取隐私 / 付费内容)。 -
规则仅列 Disallow 无 Allow:说明 "未明确禁止的路径都允许爬取"(默认规则),此时 "白名单"= 所有未被 Disallow 标注的路径。
四、合规爬取的额外注意事项
- robots.txt 仅为约定,非法律强制:但违反该规则可能导致你的爬虫被网站封禁(如 IP 拉黑),商业爬取还可能涉及法律风险;
- 动态内容验证 :部分网站的
robots.txt规则可能未及时更新,爬取前可结合实际页面的版权声明、用户协议判断; - 反爬机制兼容:即使在白名单内,高频请求仍可能被反爬系统拦截,需控制请求频率、伪装浏览器请求头。
总结
获取网站爬虫白名单的核心步骤:
- 访问
https://目标域名/robots.txt查看官方规则; - 提取
Allow字段对应的路径(白名单); - 参考 Sitemap 链接获取推荐爬取的页面;
- 无明确规则时,仅爬取公开、非敏感内容,且控制爬取频率。
自我练习实例
python
# import requests
# import re
# r = requests.get('https://m.hupu.com/hot')
# result = re.findall(r'hot_hot-page-item-title__HL2kw">(.+?)</div>',r.text)
# for i in range(len(result)):
# print('热点', i+1, result[i])
# import fake_useragent
# import requests
# from lxml import etree
# import os
#
# n = 0
# def count():
# global n
# n+=1
# return n
#
# if not os.path.exists("./Picture"):
# os.mkdir("./Picture")
# head = {
# "User-Agent":fake_useragent.UserAgent().random
# }
# for i in range(1,3):
# url = f'https://10wallpaper.com/list_wallpapaers/page/{i}'
# resp = requests.get(url,headers=head)
# result = resp.text
# tree = etree.HTML(result)
# p_list = etree.xpath("//div[@id='pics-list']/p")
# for p in p_list:
# img_url = p.xpath("./a/img/@src")[0]
# img_url2 = 'https://10wallpaper.com' + img_url
# print(img_url2)
# img_name = count()
# print(img_name)
# img_resp = requests.get(img_url2, headers=head)
# img_content = img_resp.content
# with open(f"./Picture/{img_name}.jpg", "wb") as fp:
# fp.write(img_resp.content)
# from selenium import webdriver
# from selenium.webdriver.edge.options import Options
# edge_options = Options()
#
# edge_options.binary_location = r"c:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# DRIVER_PATH = r"C:\Users\叶梓聪\AppData\Local\Programs\Python\Python37\Scripts\msedgedriver.exe"
# driver =webdriver.Edge(options=edge_options)
# driver.get('https://www.ptpress.com.cn/')
# input('dengdai')
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service
import os
# 1. 配置路径(已验证正确)
EDGE_BIN_PATH = r"C:\Program Files\Microsoft\Edge\Application\msedge.exe"
DRIVER_PATH = r"C:\Users\叶梓聪\AppData\Local\Programs\Python\Python37\Scripts\msedgedriver.exe"
# 验证驱动存在(避免路径错误)
if not os.path.exists(DRIVER_PATH):
print(f"❌ 驱动不存在:{DRIVER_PATH}")
exit()
# 2. 配置Edge选项
edge_options = Options() # 指定浏览器路径
edge_options.add_experimental_option('excludeSwitches', ['enable-logging']) # 禁用日志干扰
# 3. 初始化驱动服务
driver_service = Service(executable_path=DRIVER_PATH, log_path=os.devnull)
# 4. 启动浏览器并访问网站
try:
driver = webdriver.Edge(service=driver_service, options=edge_options)
print("✅ Edge浏览器启动成功!")
driver.get('https://www.ptpress.com.cn/') # 访问目标网站
driver.maximize_window() # 窗口最大化
input("\n按回车键关闭浏览器...") # 等待操作
driver.quit()
print("✅ 浏览器已关闭")
except Exception as e:
print(f"❌ 错误:{str(e)}")
try:
driver.quit()
except:
pass
