您现在的位置是:烟消火灭网 > 娱乐
用python爬取简单的网站数据
烟消火灭网2026-10-17 07:42:28【娱乐】2人已围观
简介用 Python 爬网页,最省事的组合是 requests 加 BeautifulSoup。别急着上 Scrapy,那玩意儿是给需要管理几十个站点、处理登录态和分布式队列的人准备的。如果你只是想把某个
用 Python 爬网页,取简最省事的网站组合是 requests 加 BeautifulSoup。别急着上 Scrapy,数据那玩意儿是取简给需要管理几十个站点、处理登录态和分布式队列的网站人准备的。如果你只是数据想把某个页面上的表格或者列表抓下来,两行导入加五行代码就能跑通。取简
我拿一个真实的网站小网站练手:quotes.toscrape.com。这网站是数据专门给人练爬虫的,结构干净,取简没有反爬。网站目标很简单——把首页所有名言、数据作者和标签抓下来。取简
先装库。网站终端里敲:
pip install requests beautifulsoup4 然后打开编辑器,数据写第一段代码:
import requests from bs4 import BeautifulSoup url = "https://quotes.toscrape.com" resp = requests.get(url) print(resp.status_code) 跑一下,输出 200 就说明服务器把页面给你了。resp.text 就是整个 HTML 字符串。这时候别急着打印出来看,几百行标签混在一起,眼睛会花。直接扔给 BeautifulSoup 解析:
soup = BeautifulSoup(resp.text, "html.parser") 接下来是关键一步:找规律。打开浏览器,右键检查那个名言区块。你会发现每条名言都包在 <div class="quote"> 里。里面有三个东西:<span class="text"> 放正文,<small class="author"> 放作者,<div class="tags"> 下面挂着一串 <a class="tag">。
那就按这个结构提取:
quotes = soup.find_all("div", class_="quote") for q in quotes: text = q.find("span", class_="text").get_text(strip=True) author = q.find("small", class_="author").get_text(strip=True) tags = [t.get_text(strip=True) for t in q.find_all("a", class_="tag")] print(text) print(author) print(tags) print("-" * 40) 这段代码跑完,十条名言整整齐齐列出来。get_text(strip=True) 里的 strip=True 别省,不然你拿到的字符串前后会带一堆换行和空格,后面存 CSV 的时候会很难看。
有人会问:如果网站有分页呢?这个站底部有个 Next 按钮,指向 /page/2/。处理分页有两种写法。一种是用 while 循环,每次找下一页链接,找不到就停。另一种更直接——先看 URL 规律,手动构造十页的地址列表,循环请求。我一般选后者,因为可控,出错也好定位。
base = "https://quotes.toscrape.com/page/{ }/" for i in range(1, 11): r = requests.get(base.format(i)) s = BeautifulSoup(r.text, "html.parser") # 同样的提取逻辑 这里有个细节:请求之间最好加个 time.sleep(1)。不是所有网站都像这个练习站那么宽容。你一秒发十个请求,对方服务器日志里全是你的 IP,轻则限速,重则封禁。加个延时,一秒钟的事,省去很多麻烦。
再聊一个容易踩的坑:find 和 find_all 的区别。find 返回第一个匹配的标签对象,find_all 返回列表。如果你写 q.find("a", class_="tag"),只会拿到第一个标签。想拿全部,必须用 find_all。我刚开始学的时候在这上面卡了半小时,打印出来只有一个标签,还以为是网站结构变了。
数据抓下来之后存哪儿?csv 模块就够了:
import csv with open("quotes.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["text", "author", "tags"]) # 循环里 writer.writerow([text, author, ",".join(tags)]) encoding="utf-8" 要写,不然中文内容会乱码。newline="" 也是,不写的话 Windows 上每行之间会多一个空行。
最后说一句实在的:爬虫本身不难,难的是应对网站的变化和反爬策略。你今天写好的选择器,明天网站改版可能就失效了。所以代码里加些容错判断,比如 if q.find("span", class_="text"):,别让一个缺失的标签把整个脚本搞崩。练习站随便折腾,真要对某个网站下手之前,先看看它的 robots.txt,这是基本规矩。
很赞哦!(133)
上一篇: 漏洞排查
下一篇: web安全测试基础知识







