资讯动态

【python网络爬虫基础上】爬取热榜实战

发布时间:2026/8/20 8:52:12 来源:尧图企业网站定制
一、网络爬虫基本概念网络爬虫通俗来讲就是使用代码将HTML网页的内容下载到本地的过程。获取网页主要是为了获取网页中的关键信息例如网页中的数据、图片、视频等。二、四大爬虫核心库Python语言中提供了多个具有支持爬虫网页功能的库。1. urllibPython内置标准库不用安装原生自带、无需额外环境代码编写复杂、功能基础、用法繁琐本篇不深入学习2. requests重点是Python的第三方库需要下载安装之后才能使用。由于requests库是在urllib库的基础上建立的它包含了urllib库的功能这使得requests库中的函数和方法的使用更加友好因此requests库使用起来更加简洁、方便。3. Scrapy专业级第三方爬虫框架需安装有完整爬虫框架自带调度、请求、解析、存储整套流程适合大型项目、专业爬虫开发、分布式爬虫本篇不深入学习4. selenium重点是Python的第三方库需要下载安装后才能使用。selenium库可用于驱动计算机中的浏览器执行相关命令而无须人员手动操作浏览器。常用于JS动态渲染网页爬虫办公自动化Web自动化测试。三、robots.txt 规则不是网站中的所有信息都允许被爬取也不是所有的网站都允许被爬取。在大部分网站的根目录中存在一个robots.txt文件该文件用于声明此网站中禁止访问的url和可以访问的url。用户只需在网站域名后面加上/robots.txt即可读取此文件的内容。例如获取豆瓣官网中的robots.txt文件打开浏览器输入豆瓣官网域名并在域名后加上/robots.tx单击访问即可获取豆瓣的robots.txt规则如图所示。robots.txt规则用于表明当前网站中的哪些内容是可以访问的哪些内容是禁止访问的。1.User-agent字段User-agent用于指定规则生效的爬虫对象。通用规则用*表示所有搜索引擎需遵守的规则。特定规则针对单个爬虫设置比如豆瓣屏蔽豌豆荚爬虫的规则为User-agent: WandouSpider Disallow: /2.Disallow规则Disallow的含义是禁止爬虫访问的URL路径。豆瓣示例中禁止访问/subject_search /search /forum/等路径。特殊值单独写/表示禁止访问整个网站。匹配规则为前缀匹配写/forum/会屏蔽/forum/ /forum/topic/123等所有子路径。3.Allow规则Allow的含义是明确允许爬虫访问的URL路径优先级高于同规则块里的Disallow。豆瓣示例中前面禁止了大部分路径但单独Allow: /ads.txt放行广告验证文件。4.其他字段Sitemap用于提供网站可爬取的URL地图帮助爬虫快速发现重点页面。Crawl-delay是建议爬虫抓取间隔时间减轻服务器压力豆瓣中被注释为# Crawl-delay: 5不生效。#注释和Python注释功能类似爬虫会直接忽略仅用于说明规则。实际应用要点爬虫抓取前必须检查目标网站的robots.txt否则属于违规抓取可能被封IP。不同搜索引擎的访问权限不同比如豆瓣对通用爬虫、谷歌广告爬虫、豌豆荚爬虫设置了不同规则。规则不是强制的只是君子协定防不住恶意爬虫敏感内容仍需登录权限保护。技术细节补充路径匹配类似磁盘目录/forum/是目录级屏蔽/forum是仅屏蔽单路径效果不同。主域名下可通过子域名访问不同内容比如sub.example.com/robots.txt是子域名的独立规则。规则文件通常长期稳定不变网站不会频繁修改爬虫会定期读取更新。四、requests库requests库适合静态网页数据采集下载在命令提示符或终端中输⼊命令pip install requests -i https://pypi.mirrors.ustc.edu.cn/simple其中后⾯的地址为镜像地址可加快安装速度。版本查询安装成功后使⽤pip show requests命令可查看库的版本信息、官⽅地址、安装⽬录等详细信息。requests库依赖urllib3、certifi、charset-normalizer和idna等库requests是在urllib3基础上开发的爬⾍库函数使⽤⽅法更为友好,通过Required-by字段可查看哪些库依赖requests库网页数据定位浏览器右键查看网页源代码 获取原始静态HTML开发者工具Elements面板定位JS渲染后元素图片地址链接GET 请求基础获取网页源码发送GET请求获取网页内容返回一个 Response 对象import requests # 发起GET请求获取网页内容 r requests.get(https://www.ryjiaoyu.com) # 输出网页文本信息 print(response.text)响应对象常用属性查看请求信息通过属性获取状态码、响应头、URL、编码等关键信息import requests r requests.get(https://www.baidu.com) print(r.status_code) # 响应状态码200成功 print(r.headers) # 响应头信息 print(r.url) # 最终请求的URL print(r.encoding) # 当前编码格式 print(r.cookies) # 服务器返回的Cookie添加信息把要搜索的内容 写成字典info {keyword:excel}keyword 是网站搜索的参数名excel 是你要搜索的内容params 接收字典参数 自动生成 URL 查询字符串 智能处理特殊符号和中文编码 无需手动拼接保障代码安全性与简洁性print(r.url)可以看到程序自动拼接完成的完整请求地址类似 https://www.bilibili.com/search?keywordexcelimport requests # 定义请求参数 字典形式 info {keyword:excel} # 发GET请求 用params绑定参数 r requests.get(https://www.bilibili.com/search, paramsinfo) # 打印拼接好的完整网址 print(r.url) # 打印搜索页面网页源码 print(r.text)状态码判断请求成功校验根据状态码判断请求是否成功避免无效解析import requests r requests.get(https://www.baidu.com) if r.status_code 200: print(请求成功) print(r.text) else: print(f请求失败状态码{r.status_code})UA伪装很多网站会直接拒绝访问 / 返回空内容写 UA伪装成正常用户成功率大幅提高import requests # 获取url url https://www.baidu.com/ # 如果不设置UA 会知道你是python包来访问网页 # UA伪装 head { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0 } # 向url发生请求 r requests.get(url,headershead) r.encoding r.apparent_encoding #自动识别当前网页的编码 print(r.text)解决乱码编码自动识别若 r.text 乱码用 apparent_encoding 自动识别编码import requests r requests.get(https://www.xxx.com) # 自动识别并设置编码 r.encoding r.apparent_encoding print(r.text)下载二进制资源图片/文件用 r.content 获取二进制内容以 wb 模式保存import requests # 图片URL img_url https://example.com/image.jpg # 发送请求获取图片数据 r requests.get(img_url) # 以二进制写入模式保存图片 with open(test.jpg, wb) as f: f.write(r.content)POST 请求基础发送POST请求提交表单数据到服务器import requests # 构造表单数据 data {username: test, password: 123456} # 发送POST请求 r requests.post(https://example.com/login, datadata) print(r.text)练习下面是一个爬取虎扑热榜的实战import requests用来发送请求 获取网页内容import fake_useragentpip安装无法用于python3.7及以下版本用来生成随机的User-Agent伪装成浏览器请求pip install fake_useragent -i https://pypi.tuna.tsinghua.edu.cn/simpleimport re用来写正则表达式从页面里提取数据User-Agent 它是浏览器发给服务器的“身份证”告诉服务器“我是Chrome/Edge/iPhone浏览器”。如果没有这个服务器会把你的Python请求当成爬虫拦截。fake_useragent.UserAgent().random会随机生成一个真实的浏览器User-Agent每次请求都不一样降低被识别的概率。requests.get(url, headersheader) 向虎扑热榜地址发送GET请求带上我们生成的请求头requests.get()是最常用的GET请求方法参数里url是目标网址headers是请求头把服务器返回的响应保存到变量r里r是一个Response对象包含响应内容、状态码、编码等信息r.encoding r.apparent_encoding 自动识别网页的编码格式解决中文乱码问题有些网页编码不是默认的UTF-8用apparent_encoding可以自动检测避免中文变成乱码print(r.text) 把服务器返回的网页源代码打印出来r.text就是网页的HTML源代码是一个大字符串我们后面要从这里面提取数据用正则表达式提取热榜标题遍历result列表里的所有标题按序号打印出来。enumerate()函数会同时返回列表的索引位置和值这里i是索引j是标题内容。五、XPath库这是Python 爬虫最常用的数据提取方式配合 requests 爬取网页数据下载在命令提示符或终端中输⼊命令pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple把下面内容复制保存为test.html放在和 Python 代码同一个文件夹里html langen head meta charsetUTF-8 / title测试bs4/title /head body div p百里守约/p /div div classsong 你好 p李清照/p p王安石/p p苏轼/p p柳宗元/p a hrefhttp://www.song.com/ title赵匡胤 target_self spanthis is span/span 宋朝是最强大的王朝不是军队的强大而是经济很强大国民都很有钱/a a href classdu总为浮云能蔽日,长安不见使人愁/a img srchttp://www.baidu.com/meinv.jpg alt / /div div classtang ul 清明时节雨纷纷,路上行人欲断魂 li a hrefhttp://www.baidu.com titleqing 清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村 /a /li li a hrefhttp://www.163.com titleqin 秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山 /a /li lia hrefhttp://www.126.com altqi岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君/a/li lia hrefhttp://www.sina.com classdu杜甫/a/li lia hrefhttp://www.dudu.com classdu杜牧/a/li lib杜小月/b/li lii度蜜月/i/li lia hrefhttp://www.haha.com idfeng凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘/a/li /ul /div /body /html运行这段代码from lxml import etree # parse 提供解析本地html文件的方法 tree etree.parse(test.html) # xpath获取返回的数据类型都是列表形式 # 获取到title对象 print(tree.xpath(/html/head/title/text())) print(tree.xpath(/html/body/div/p/text())) # 索引定位 这里的索引从1 开始 print(tree.xpath(/html/body/div[1]/p/text())) print(tree.xpath(/html/body/div[2]/p/text())) print(tree.xpath(/html/body/div[2]/p[2]/text())) # 属性定位 class,id print(tree.xpath(/html/body/div[classsong]/p[2]/text())) # / 表示的是一个层级 // 表示的是多个层级 print(tree.xpath(//div[classsong]/p[3]/text())) # /text() 取直系标签下的文本内容 # //text() 取该标签下的所有文本内容 print(tree.xpath(//div[classsong]/p[2]/text())[0]) print(tree.xpath(//div[classsong]//text())) # 取标签内的属性内容 src、href、 print(tree.xpath(//div[classsong]/img/src)) print(tree.xpath(//div[classtang]/ul/li[3]/a/href)[0])输出示例匹配返回结果永远为列表类型无论 XPath 表达式匹配到 1 个、多个还是无数据最终返回值固定是列表。匹配单条内容需通过下标 [0] 取出字符串无匹配时返回空列表 []。节点索引从 1 开始计数XPath 中标签排序不遵循编程常规的从 0 开始而是从 1 开始。如需定位第 N 个同层级标签格式为 标签名[N]禁止使用下标 0。单斜杠 /逐级精准匹配直系子节点/ 代表层级严格匹配仅查找当前标签的直接子标签不会匹配嵌套深层的孙子级、重孙级节点适合结构固定、层级清晰的页面定位。双斜杠 //全局模糊匹配所有后代节点// 代表全局检索忽略嵌套层级从整个文档中匹配所有符合条件的标签无论标签嵌套多深都能一次性获取是爬虫开发最常用写法。text() 提取文本、属性名 提取标签属性text()用于获取标签内部的纯文本内容xxx用于提取标签自带属性常用场景href 抓取超链接、src 抓取图片地址、class/id 定位特征属性。练习1爬取虎扑热榜xpath import requests from lxml import etree rrequests.get(https://m.hupu.com/hot) treeetree.HTML(r.text) a_listtree.xpath(//article[classhot_hot-page__jgBZU]/div) for i,j in enumerate(a_list): try: resultj.xpath(./section/div[2]/text()) print(热点第,i1,话题,result[0]) except: pass代码解析导入requests库作用是发送网络请求获取网页源代码。导入lxml里的etree作用是解析网页源码支持用XPath筛选提取数据。调用get方法访问虎扑移动端热榜网址把网页返回的全部内容存到变量里。构建HTML解析树把拿到的网页文本转换成结构化的HTML树形对象只有转成这个格式才能用XPath查找元素。定位所有热榜条目用XPath匹配页面上所有热榜帖子的外层标签把所有热榜条目统一抓取出来存成列表。循环遍历热榜列表用enumerate循环既能拿到每条热榜的序号也能拿到单条帖子的网页元素。异常捕获加try容错防止某一条帖子结构特殊、提取不到文字导致整个程序崩溃出错就自动跳过。提取单条热点标题在当前这条帖子元素内部用相对XPath往下找对应的标签提取里面的文字内容。打印输出取出提取到的文本拼接排名和话题名称打印出来。异常兜底如果中间提取内容报错触发except直接跳过这条不报错、不终止程序。XPath // 是全局查找./ 是从当前节点往下相对查找。text() 专门用来获取标签里面的文字。爬虫加try except是常规操作兼容网页结构不规则的情况。网页带随机字符的class会随时失效代码过段时间就爬不到。爬取虎扑热榜xpath更简洁 import requests from lxml import etree rrequests.get(https://m.hupu.com/hot) # HTML 提供解析在线html文件的方法 treeetree.HTML(r.text) topicstree.xpath(//div[classhot_hot-page-item-title__HL2kw]/text()) for i,j in enumerate(topics): print(热点第,i1,话题,j)上一版先抓外层大容器再逐个进去找标题层级多还要加异常防止报错。这一版XPath直接把所有标题一次性抓完不用嵌套查找、不用写异常捕获代码更短逻辑更简单。运行结果

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价