当前位置:首页 > 娱乐

python爬虫网页代码

写爬虫最怕一上来就抄代码。爬虫你复制了二十行 urllib 请求,网页跑起来返回 403,代码连个报错原因都找不到。爬虫问题不在代码本身,网页在于你没搞清楚目标网站到底在防什么。代码

先看一个真实案例。爬虫去年我想抓某招聘网站的网页岗位数据,直接 requests.get 拿到的代码 HTML 里只有一句“请开启 JavaScript”。换成浏览器打开,爬虫岗位列表正常显示。网页这说明数据是代码 JS 动态渲染的,静态请求拿不到。爬虫

解决办法不是网页硬刚,是代码换思路。打开 Chrome 开发者工具,切到 Network 面板,刷新页面,筛选 XHR 请求。果然,一个 API 接口返回了 JSON 格式的岗位列表。直接请求这个接口,带上正确的 headers,数据就拿到了。

import requests url = "https://example.com/api/jobs?page=1" headers = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "Referer": "https://example.com/jobs" } resp = requests.get(url, headers=headers) data = resp.json() for job in data["list"]: print(job["title"], job["salary"]) 

这段代码能跑通的关键就两个:User-Agent 伪装成浏览器,Referer 告诉服务器你是从哪个页面跳过来的。缺一个都可能被拒。

但有些网站不吃这套。它们会检查 Cookie、校验签名参数、甚至用字体反爬。遇到这种情况,我一般先判断值不值得死磕。如果只是临时抓几百条数据,用 Selenium 或 Playwright 模拟浏览器操作更省事。虽然慢,但稳定。

from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://example.com/jobs") page.wait_for_selector(".job-card") cards = page.query_selector_all(".job-card") for card in cards: title = card.query_selector(".title").inner_text() print(title) browser.close() 

Playwright 的好处是自带等待机制,不用自己写 sleep 猜加载时间。headless=True 在服务器上跑也没问题。

再说一个容易踩的坑:频率控制。有人写爬虫喜欢开多线程猛冲,结果 IP 被封。我的习惯是单线程加随机延时,每次请求间隔 1 到 3 秒。看起来慢,但一晚上也能抓几万条,而且不容易触发风控。

import time import random for page in range(1, 101): resp = requests.get(f"https://example.com/api?page={ page}", headers=headers) # 处理数据... time.sleep(random.uniform(1, 3)) 

如果目标网站有 robots.txt,先看一眼。不是说要完全遵守,但至少知道哪些路径是明确禁止的。有些站点会在 robots.txt 里写 Crawl-delay,这个值可以参考。

最后说数据存储。小规模直接存 CSV 或 JSON,别急着上数据库。我见过有人抓了 200 条数据就建 MySQL 表、写 ORM 映射,纯属折腾。等数据量过万、需要频繁查询了再考虑 SQLite 或 PostgreSQL。MongoDB 适合字段不固定的场景,比如不同岗位的福利标签数量不一致。

爬虫代码没有万能模板。每个网站的反爬策略不同,先分析再动手,比复制粘贴强得多。

分享到: