当前位置:首页 > 百科 > 怎么爬取网站上的数据 正文

怎么爬取网站上的数据

来源:烟消火灭网   作者:休闲   时间:2026-10-17 05:53:15

去年我想抓一个二手房网站的网站历史成交价,打开浏览器控制台一看,上的数据数据全在 HTML 里躺着,网站连 AJAX 都没用。上的数据那一刻我意识到,网站很多网站的上的数据数据比想象中好拿——只要你懂点门道。

爬数据这件事,网站核心就三步:拿到页面、上的数据提取信息、网站存下来。上的数据听起来简单,网站但每一步都有坑。上的数据

先搞清楚你要爬什么

打开目标网站,网站按 F12。上的数据看 Network 面板,网站刷新页面。如果数据是跟着 HTML 一起回来的,那用 requests 直接请求就行。如果页面加载完后还有额外的 XHR 请求,那数据大概率藏在某个 JSON 接口里——直接请求那个接口,比解析 HTML 省事得多。

我上次帮朋友抓某招聘网站的岗位信息,列表页只返回了 10 条,翻页靠的是 POST 请求带 offset 参数。找到这个规律后,写个循环就能把几千条数据全拉下来。比模拟点击“下一页”按钮靠谱多了。

请求页面:别让服务器把你当机器人

import requests headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } resp = requests.get('https://example.com/list?page=1', headers=headers) print(resp.status_code)

不带 User-Agent 的请求,很多网站直接返回 403。这算最基础的伪装。频率太高会被封 IP,加个 time.sleep(1) 是最低成本的礼貌。如果对方有反爬机制,可能还需要处理 Cookie、Referer,甚至用 Selenium 模拟真实浏览器行为。

我个人的判断是:能用 requests 就别上 Selenium。后者慢、吃内存,调试起来也烦。只有当页面数据完全由 JavaScript 动态渲染、又找不到可用的 API 时,才值得动用浏览器自动化。

提取数据:解析 HTML 的两种武器

拿到 HTML 之后,用 BeautifulSoup 或 lxml 解析。前者容错性好,后者速度快。

from bs4 import BeautifulSoup soup = BeautifulSoup(resp.text, 'lxml') items = soup.select('.house-list .item') for item in items: title = item.select_one('.title').get_text(strip=True) price = item.select_one('.price').get_text(strip=True) print(title, price)

CSS 选择器比 XPath 好写,但遇到结构复杂的页面,XPath 更灵活。比如 //div[@class="price"]/following-sibling::span[1] 这种,CSS 就表达不了。选哪个看具体场景,没必要站队。

有个细节值得注意:get_text(strip=True) 里的 strip=True 能去掉首尾空白和换行符。不加这个参数,抓下来的文本经常带着一堆 \n 和空格,后面清洗起来很烦。

存下来:CSV 还是数据库

数据量小,直接写 CSV。pandas 的 to_csv 一行搞定。数据量大、需要去重或关联查询,上 SQLite。别一上来就 MySQL、MongoDB,本地测试阶段 SQLite 足够用,零配置,一个文件搞定。

import csv with open('output.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['标题', '价格']) for item in data: writer.writerow([item['title'], item['price']])

编码问题踩过一次坑:某网站返回的是 GBK 编码,requests 自动识别成 ISO-8859-1,抓下来的中文全是乱码。手动设 resp.encoding = 'gbk' 才解决。遇到乱码先查 resp.apparent_encoding,能省不少时间。

法律和道德边界

爬公开数据、控制频率、不造成服务器负担,一般没问题。但绕过登录、抓取付费内容、大规模并发请求,那就越线了。robots.txt 不是法律,但它是网站明确表达的意愿,看一眼不费事。

我自己的原则:只抓自己能看到的内容,不碰需要登录才能访问的数据,请求间隔不低于 1 秒。真被封了,换个 IP 继续也不难,但没必要把事情做绝。

爬虫就是个工具。用它做什么,取决于你。

标签:

责任编辑:知识