游客发表

python网络爬虫源代码

发帖时间:2026-10-17 04:55:43

很多人第一次写爬虫,网络代码不到二十行就能跑起来。爬虫比如抓豆瓣电影Top250的源代页面标题,核心就三行:发请求、网络拿HTML、爬虫正则匹配。源代但这段代码活不过三天——豆瓣会封IP,网络页面结构一改就抓瞎,爬虫更别提那些用JavaScript渲染的源代站点,requests拿到的网络HTML里根本没有你要的数据。

我见过太多人卡在这一步。爬虫他们照着教程敲完requests.get()和BeautifulSoup,源代发现返回的网络是一堆乱码或者空壳,然后就开始怀疑人生。爬虫问题不在代码本身,源代在于对“爬虫”这件事的理解太窄了。

一个真实的翻车现场

去年帮朋友抓某招聘网站的岗位数据。用requests直接请求列表页,返回的HTML里只有骨架,岗位信息全是JS异步加载的。换成Selenium模拟浏览器,能拿到数据了,但速度慢得离谱——翻一页等五秒,抓两百页花了大半天。后来抓包发现有个XHR接口返回JSON,参数里有个timestamp和sign签名。逆向那个sign算法花了两个小时,最终用requests直接调接口,两分钟跑完。

这个案例说明一件事:写爬虫的核心不是写代码,是搞清楚数据怎么来的。

源代码该长什么样

一个能用的爬虫脚本,结构大致如下。以抓取某新闻站列表页为例:

import requests from bs4 import BeautifulSoup import time import random HEADERS = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } def fetch(url): try: resp = requests.get(url, headers=HEADERS, timeout=10) resp.raise_for_status() resp.encoding = resp.apparent_encoding return resp.text except requests.RequestException as e: print(f"请求失败: { e}") return None def parse(html): soup = BeautifulSoup(html, "html.parser") items = [] for li in soup.select(".news-list li"): title = li.select_one("a").get_text(strip=True) link = li.select_one("a")["href"] items.append({ "title": title, "link": link}) return items if __name__ == "__main__": for page in range(1, 6): url = f"https://example.com/news?page={ page}" html = fetch(url) if html: for item in parse(html): print(item["title"]) time.sleep(random.uniform(1, 3)) 

这段代码没什么花哨的地方,但包含了几个关键点:请求头伪装、异常捕获、编码处理、随机延时。少了任何一样,都可能被目标站点识别出来。

反爬这件事,绕不开

现在的网站,稍微有点流量意识的都会上防护。Cloudflare的5秒盾、验证码、IP频率限制、蜜罐链接——你想到的,对方早就想到了。我个人的经验是:不要硬刚,要顺着来。

比如遇到Cloudflare,可以用cloudscraper库试试;遇到验证码,手动打码或者接打码平台;遇到IP限制,上代理池。但代理池的质量参差不齐,免费的基本不能用,付费的也要挑。我曾经买过某平台的代理,一百个IP里能用的不到十个,延迟还高得吓人。

另一个思路是降低请求频率。很多人写爬虫恨不得一秒发十个请求,这不封你封谁。加个time.sleep(random.uniform(2, 5)),模拟人类浏览的节奏,存活率会高很多。

法律红线别碰

爬虫本身不违法,但爬什么、怎么爬、爬了之后干什么,这三件事决定了你是在做技术练习还是在踩缝纫机。公开数据、遵守robots.txt、不搞破坏、不拿去卖钱——这几条底线守住了,基本不会出大问题。我见过有人爬某电商平台的用户评价,还带着用户昵称和头像,这就很危险了。

写爬虫的乐趣在于跟网站斗智斗勇,但前提是别把自己搭进去。

    热门排行

    友情链接