当前位置: 首页 > news >正文

python网络爬虫(第一步:网络爬虫库、robots.txt规则(防止犯法)、查看获取网页源代码)

python网络爬虫(第一步:网络爬虫库、robots.txt规则(防止犯法)、查看获取网页源代码)

(学习第二步在这里)

python网络爬虫(第二步:安装浏览器驱动,驱动浏览器加载网页、批量下载资源)-CSDN博客

网络爬虫库

  1. urllib库
    作为Python内置的标准HTTP库,urllib提供了基础的网络请求功能。其优势在于无需额外安装,适合快速验证性开发或受限环境使用。但由于API设计较为底层,处理复杂请求时需要编写更多样板代码,开发效率相对较低。

  2. requests库
    这个广受欢迎的第三方库在urllib基础上进行了高层封装,提供了更符合Python风格的API设计。支持会话保持、自动编解码等高级特性,大幅提升了开发效率。其简洁的语法和丰富的文档使其成为日常爬虫开发的首选工具。

  3. scrapy框架
    这是一个专业级的爬虫框架,采用完整的架构设计。不仅支持高性能的并发爬取,还内置了数据处理管道、中间件系统等企业级功能。适合构建复杂的分布式爬虫系统,学习曲线相对较陡但扩展性极强。

  4. selenium工具
    通过浏览器自动化技术,selenium能够完美处理动态渲染的网页内容。虽然执行效率较低,但在需要模拟用户操作或破解反爬机制时具有不可替代的优势。除了爬虫应用,还广泛用于Web自动化测试领域。

robots.txt规则(防止犯法)

robots.txt 是网站用来指导搜索引擎爬虫(如 Googlebot、Baiduspider)如何抓取网站内容的文本文件,遵循 Robots 排除协议(REP)。它放置在网站的根目录(如 https://example.com/robots.txt),供爬虫在访问其他页面前优先读取。


基本规则

  1. User-agent

    • 指定规则适用的爬虫名称,* 表示所有爬虫。

    • 示例:

      User-agent: Googlebot   # 仅对谷歌爬虫生效
      User-agent: *          # 对所有爬虫生效
  2. Disallow

    • 禁止爬虫访问的路径(支持通配符 *)。

    • 示例:

      Disallow: /private/    # 禁止访问 /private/ 目录
      Disallow: /tmp/*.html  # 禁止所有 /tmp/ 下的 .html 文件
  3. Allow

    • 允许爬虫访问的路径(优先级高于 Disallow)。

    • 示例:

      Allow: /public/        # 允许访问 /public/ 目录
      Allow: /search/        # 允许访问 /search/ 路径
  4. Sitemap

    • 指定网站的站点地图(XML格式)位置,帮助爬虫发现内容。

    • 示例:

      Sitemap: https://example.com/sitemap.xml

常见规则示例

1. 禁止所有爬虫访问全站

User-agent: *
Disallow: /

2. 禁止所有爬虫访问特定目录

User-agent: *
Disallow: /admin/
Disallow: /logs/

3. 针对不同爬虫设置不同规则

User-agent: Googlebot
Allow: /news/
Disallow: /draft/

User-agent: Baiduspider
Disallow: /

4. 允许爬虫访问部分动态参数页面

User-agent: *
Allow: /search?q=*
Disallow: /search?*&private=*


如果网站没有robots.txt规则,如下:

一般默认允许用户使用爬虫工具访问,但仍要遵循《中华人民共和国网络安全法》

如:人民邮电出版社https://www.ptpress.com.cn/robots.txt

如果网站有robots.txt规则(以b站为例):

bilibili.com/robots.txthttps://www.bilibili.com/robots.txt

所有爬虫通用规则(针对所有爬虫)

  1. 禁止访问的路径

    • Disallow: /medialist/detail/
      屏蔽所有爬虫访问 /medialist/detail/ 目录下的内容(如某些媒体详情页)。

    • Disallow: /index.html
      禁止抓取根目录下的 index.html 文件。

  2. 最终兜底规则

    • 最后的 User-agent: * + Disallow: /
      优先级最高,表示未明确允许的其他爬虫将完全禁止访问整个网站(之前单独允许的爬虫除外)。


针对特定爬虫的例外规则

以下爬虫被单独允许访问全站(不受最终 Disallow: / 限制):

  • Yisouspider(神马搜索)

  • Applebot(苹果搜索)

  • bingbot(微软必应)

  • Sogou(搜狗蜘蛛)

  • 360Spider(360搜索)

  • Googlebot(谷歌)

  • Baiduspider(百度)

  • Bytespider(字节跳动)

  • PetalBot(华为花瓣搜索)


社交媒体爬虫的特殊权限

仅允许以下机器人访问 /tbhx/hero 路径(可能是活动页或英雄页面):

  • facebookexternalhit(Facebook)

  • Facebot(Facebook)

  • Twitterbot(Twitter)
    其他路径仍被禁止。

学习查找获取网页源代码

网页空白处右键,点击 “检查” 

点击左上角的按键

将鼠标移动到页面中需要找的图片或者文本,点击后,右侧会跳转至代码所处位置

双击蓝色标记处,复制路径,或右键复制元素

现在我们来做一些练习吧:

代码 1

import requests
r = requests.get('https://www.ptpress.com.cn/')
print(r.text)

运行结果:打印出人民邮电出版社官网的 HTML 源代码。
代码解析:该函数使用 requests 库的 get 方法向指定 URL 发送 HTTP GET 请求,获取网页内容并存储在响应对象 r 中,r.text 返回网页的文本内容。

代码 2

import requests
r = requests.get('https://www.ptpress.com.cn/search?keyword=excel')
print(r.text)

运行结果:打印出人民邮电出版社官网搜索关键词 “excel” 后的搜索结果页面的 HTML 源代码。
代码解析:向指定 URL 发送带关键词参数的 GET 请求,获取搜索结果页面内容。

代码 3

import requests
info ={'keyword':'excel' }
r = requests.get('https://www.ptpress.com.cn/search',params=info)
print(r.text)
print(r.url)   #输出:https://www.ptpress.com.cn/search?keyword=excel

运行结果:先打印出完整的请求 URL(人民邮电出版社),再打印搜索结果页面的 HTML 源代码。
代码解析:通过 params 参数传递字典形式的查询参数,构建完整请求 URL 并获取响应内容。

代码 4

import requests
r = requests.get('https://www.ptpress.com.cn')
print(r.status_code)   #输出:200
if r.status_code==200:print(r.text)
else:print('本次访问失败')

运行结果:先打印 HTTP 状态码(200 表示成功),若成功则打印网页 HTML 源代码,否则打印访问失败提示。
代码解析:通过 status_code 属性判断请求是否成功,并根据结果进行不同处理。

状态码200:请求成功

状态码301:网页内容被永久转移到其他URL

状态码404:请求的网页不存在

状态码500:内部服务器错误

代码 5

import requests
r = requests.get('https://www.baidu.com')
r.encoding = r.apparent_encoding
print(r.text)

运行结果:打印百度首页的 HTML 源代码,确保中文能正常显示。
代码解析:通过 apparent_encoding 属性自动检测网页实际编码,并将其赋值给 encoding 属性,解决中文乱码问题。

代码 6

按上面操作获取一个图片的路径

import requests
r = requests.get('https://cdn.ptpress.cn/uploadimg/Material/978-7-115-41359-8/72jpg/41359.jpg')
f2 = open('b.jpg','wb')
f2.write(r.content)
f2.close()

运行结果:将指定 URL 的图片下载并保存为本地文件 b.jpg。
代码解析:使用 content 属性获取响应的二进制内容(适用于图片、文件等),并以二进制写入模式将内容写入文件。

代码 7

import requests
import re
r = requests.get('https://www.ryjiaoyu.com/tag/details/7')
result = re.findall(r'title=(.+?)">(.+?)</a></h4>',r.text)
for i in range(len(result)):print('第',i+1,'本书: ',result[i][1])

运行结果:打印出网页中匹配正则表达式的书籍标题信息。
代码解析:使用正则表达式从网页文本中提取书籍标题信息,返回一个包含匹配结果的列表,并遍历打印。

学爬虫一定要学正则表达式,很简单,去这里学:

python正则表达式re(Regular Expression)-CSDN博客https://blog.csdn.net/2302_78022640/article/details/149300302?spm=1011.2415.3001.5331

以下内容知识点速过

代码 8

'''post 请求'''

import requests
d={'OldPassword':'123python','NewPassword':'123456python','ConfirmPassword':'123456python'}
r = requests.post('https://account.ryjiaoyu.com/change-password', data=d)
print(r.text)

运行结果:打印密码修改页面的响应内容。
代码解析:使用 post 方法向指定 URL 发送包含表单数据的 HTTP POST 请求,用于提交数据(如修改密码)。(看终端)

代码 9

import requests
fp ={"file":open('bitbug.ico','rb')}
r = requests.post('http://httpbin.org/post',files = fp)
print(r.text)

运行结果:打印httpbin.org测试服务返回的包含上传文件信息的响应内容。
代码解析:通过 files 参数上传文件,将本地文件以二进制模式打开并作为请求的一部分发送。(看终端)

代码 10

'''会话'''

import requests
s = requests.Session()
data = {'Email': '15156883862','Password': '123python','RememberMe': 'true','__RequestVerificationToken': 'qh6oY_zP255k2dk83pW5ZNajoAMQD9QxP3tLOK5f54wmccKgzOPCoUhHP5ICO5xlqg2yyLZM_NisZJyOzNszwZcKEteXOInHEv6sW9HlY9Q1'}
r1 = s.post('https://account.ryjiaoyu.com/log-in?returnUrl=https%3a%2f%2fwww.ryjiaoyu.com%2f',data=data)
r2 = s.get('https://www.ryjiaoyu.com/user')
print(r1.text, r2.text)

运行结果:依次打印登录页面和用户页面的响应内容。
代码解析:使用 Session 对象保持会话状态,在登录后可以访问需要权限的页面。

代码 11

'''代理服务器'''

import requests
proxie = {'http':'http://115.29.199.16:8118'}
r = requests.get('https://www.ryjiaoyu.com/',proxies= proxie)
print(r.text)

运行结果:打印通过代理服务器访问网页的响应内容。
代码解析:通过 proxies 参数设置代理服务器,用于隐藏真实 IP突破访问限制(爬多了被网站拉黑了)

代码 12

import requests
import re
def get_Token(s):r0 = s.get('https://account.ryjiaoyu.com/log-in?ReturnUrl=https%3A%2F%2Fwww.ryjiaoyu.com%2Fuser')result = re.findall(r'__RequestVerificationToken(.+)value="(.+)" />', r0.text)return r0,result[0][1]
s = requests.Session()
r0,Token =  get_Token(s)
data = {'__RequestVerificationToken':Token,'Email': '15156883862','Password': '123python','RememberMe': 'true'}
r1 = s.post('https://account.ryjiaoyu.com/log-in?returnUrl=https%3a%2f%2fwww.ryjiaoyu.com%2f',data=data)
r2 = s.get('https://www.ryjiaoyu.com/user')
f0 = open('登录前前的网页.html','w',encoding='utf-8')
f1 = open('登录前的网页.html','w',encoding='utf-8')
f2 = open('登录后的网页.html','w',encoding='utf-8')
f0.write(r0.text)
f1.write(r1.text)
f2.write(r2.text)
f0.close()
f1.close()
f2.close()

运行结果:将登录过程中的三个页面内容分别保存为本地 HTML 文件。
代码解析:定义函数获取 CSRF 验证令牌,使用 Session 对象保持会话状态完成登录,并将不同阶段的页面内容保存到文件中。

(学习第二步在这里)

python网络爬虫(第二步:安装浏览器驱动,驱动浏览器加载网页、批量下载资源)-CSDN博客

http://www.lryc.cn/news/590872.html

相关文章:

  • Selenium 启动的浏览器自动退出问题分析
  • 【46】MFC入门到精通——MFC显示实时时间,获取系统当前时间GetCurrentTime()、获取本地时间GetLocalTime()
  • 结合自身,制定一套明确的 Web3 学习路线和技术栈建议
  • 保持视频二维码不变,如何更新视频内容,节省物料印刷成本
  • 板凳-------Mysql cookbook学习 (十二--------1)
  • 离散与组合数学 杂记
  • 【AI前沿】英伟达CEO黄仁勋ComputeX演讲2025|Token是AI时代的“新货币”
  • CSDN首发:研究帮平台深度评测——四大AI引擎融合的创作革命
  • 从零开始的云计算生活——第三十三天,关山阻隔,ELK日志分析
  • docker 容器无法使用dns解析域名异常问题排查
  • HCIE - 云计算拿下后的职业选择如何规划?
  • 生成式AI干预下的认知依赖与批判性思维发展:基于ChatGPT辅助写作的纵向追踪
  • HCIE - 云计算方向考什么?一文全解
  • docker--安装--原理
  • Flutter Android打包学习指南
  • 机器学习:数据清洗与预处理 | Python
  • cors跨域资源共享
  • 2025年Java后端秋招面试的高频八股文+场景题
  • Linux C 进程基本操作
  • 【Elasticsearch】Elasticsearch 快照恢复 API 参数详解
  • Git 多人协作实战:从基础操作到分支管理全流程记录
  • 关于el-table异步获取数据渲染动态列数据赋值列数据渲染时title高度异常闪过问题
  • vue3+ts+elementui-表格根据相同值合并
  • Linux之Zabbix分布式监控篇(二)
  • 算法竞赛备赛——【图论】求最短路径——Floyd算法
  • 【华为机试】122. 买卖股票的最佳时机 II
  • React 学习(4)
  • 研发知识系统选型实战:从 Notion 到 Gitee Wiki 的迭代经验
  • STM32 DMA通信详解
  • 求解偏微分方程的傅里叶积分解