python爬取网页详细教程
爬网页,网页说穿了就三步:拿到HTML,详细从里面挖出你要的教程东西,存下来。网页别想得太玄乎,详细Python干这活儿的教程家什就那几样——requests负责敲门要数据,BeautifulSoup或者lxml负责把门后的网页垃圾堆翻出金子。今天拿豆瓣电影Top250开刀,详细这网站结构干净,教程反爬又松,网页最适合练手。详细
先装工具。教程命令行敲两行:pip install requests beautifulsoup4,网页完事。详细别装scrapy,教程那是杀鸡用牛刀,新手光配环境就能劝退一半人。
import requests from bs4 import BeautifulSoup url = "https://movie.douban.com/top250" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } resp = requests.get(url, headers=headers) resp.encoding = "utf-8" soup = BeautifulSoup(resp.text, "html.parser") 看到那个headers没?这玩意儿就是你的伪装。豆瓣会查来访者的身份,不带User-Agent的请求直接被当成机器人拒之门外。我一开始写爬虫也老忘这茬,结果返回来的全是403错误页面,还以为是代码写错了,后来才反应过来是没穿马甲。
拿到HTML之后别急着正则硬抠。用BeautifulSoup的select方法,像CSS选择器那样定位元素,省心得多。打开浏览器按F12,鼠标点一下电影标题,看右侧高亮的那行代码——<span class="title">肖申克的救赎</span>。复制这个选择器路径,代码里写:
titles = soup.select("span.title") for t in titles: if "/" not in t.text: # 过滤掉外文名 print(t.text) 跑一下,25个标题整整齐齐列出来了。哎,注意那个if "/" not in t.text——豆瓣每个电影会有两个title标签,一个中文一个原文,原文前面带斜杠。这种小坑不踩一次你根本记不住。
接着翻页。Top250有10页,每页25条,URL末尾的?start=0就是页码参数,每页加25。写个for循环包起来:
for page in range(10): url = f"https://movie.douban.com/top250?start={ page*25}" # 重复上面请求+解析的代码 time.sleep(2) # 礼貌性停顿,别把人家服务器打爆 说到time.sleep,这是爬虫的保命符。我有次贪快,循环里没加延迟,爬到第七页直接被封IP,整个宿舍楼断网半小时。后来学乖了,每请求一次歇两秒,像人浏览网页的节奏。真要大规模爬,那得上代理池和随机延迟,但那是后话。
数据到手了,存成文件才算完事。CSV最通用:
import csv with open("movies.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["标题", "评分"]) # 循环里把数据写入 注意utf-8-sig编码,直接用utf-8的话Excel打开会乱码,这坑我当年踩得莫名其妙。
爬虫这事儿,说白了就是跟网站玩捉迷藏。有的站规矩,改改UA就能过;有的站精得很,要验证码、要登录、要动态渲染。真遇上那种硬茬,得上Selenium模拟浏览器,但那是进阶玩法。先把静态页爬利索了,理解请求-解析-存储这条链路,后面遇到什么妖魔鬼怪都是换汤不换药。
最后提醒一句:爬虫有边界。豆瓣这种公开数据爬来练手没问题,但涉及个人信息、付费内容的站点,别碰。法律风险不是闹着玩的,前阵子爬简历那个案子判了五年。代码能跑是本事,知道什么不该爬是智慧。









