python爬虫实例100例
用Python写爬虫,爬虫第一个能跑通的实例实例往往比看十篇教程都管用。我见过太多人卡在“环境装好了,爬虫然后呢”这一步。实例直接上代码——抓取豆瓣电影Top250的爬虫第一页,提取电影名和评分,实例存进CSV。爬虫这段代码不到30行,实例但包含了requests请求、爬虫BeautifulSoup解析、实例文件写入三个核心动作。爬虫
import requests from bs4 import BeautifulSoup import csv url = "https://movie.douban.com/top250" headers = { "User-Agent": "Mozilla/5.0"} resp = requests.get(url,实例 headers=headers) soup = BeautifulSoup(resp.text, "html.parser") items = soup.find_all("div", class_="item") with open("douban_top250.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["排名", "片名", "评分"]) for i, item in enumerate(items, 1): title = item.find("span", class_="title").text rating = item.find("span", class_="rating_num").text writer.writerow([i, title, rating]) 跑完这30行,你就有了一个能复用的爬虫模板。换掉URL和解析规则,实例它能抓新闻标题、爬虫商品价格、招聘信息。爬虫的本质就是“请求-解析-存储”这个循环,剩下的都是在这个骨架上加东西。
翻页是第二个必须跨过的坎。豆瓣Top250有10页,URL规律是?start=0、?start=25、?start=50。写个循环把start从0到225步进25,每页抓完time.sleep(2),250条数据就到手了。不sleep的后果我试过——IP被封了三天,当时还在用公司网络,差点被运维找上门。
动态加载的页面是另一个分水岭。比如抓微博热搜,requests拿到的HTML里根本没有热搜词,数据是JavaScript渲染出来的。这时候要么分析XHR请求直接拿JSON接口,要么上Selenium。我倾向于先打开开发者工具的Network面板,筛选XHR,刷新页面,看有没有返回JSON的接口。大部分网站都有,直接请求那个接口比模拟浏览器快十倍。
登录态是绕不开的。用requests.Session()保持cookie,先POST登录表单,再带着session去请求需要登录的页面。遇到验证码就头疼了——简单的图形验证码可以用ddddocr这类库识别,复杂的滑块验证码建议直接放弃,换移动端API或者手工抓包。我抓过某电商平台的订单数据,最后发现移动端接口只需要一个token,比网页端简单得多。
反爬策略得具体网站具体看。有的检查User-Agent,有的检查Referer,有的统计请求频率。我习惯准备一个UA池,每次请求随机选一个。代理IP池成本高,个人项目用免费代理基本等于浪费时间——十个里九个连不通。不如把请求间隔拉长,伪装得像个正常用户。
数据存哪儿也有讲究。小规模用CSV和JSON就够了,上了十万条考虑SQLite,再大就上MySQL或MongoDB。我抓过某论坛的帖子,20万条数据塞进SQLite,查询慢得离谱,换成MongoDB后舒服多了。字段不固定的数据别硬塞进关系型数据库,这是血的教训。
最后说个真实案例。朋友让我帮忙抓某招聘网站Python岗位的薪资分布,我写完爬虫跑了一晚上,拿到3000多条数据。用pandas做了个简单的薪资区间统计,发现15k-25k的岗位占比最高,但30k以上的岗位里,要求“熟悉分布式系统”的出现频率是其他岗位的三倍。这个结论直接帮他调整了学习方向。爬虫的价值不在技术本身,在于你能拿数据回答什么问题。
100个实例听起来多,拆开看无非是请求方式、解析库、存储方案、反爬应对这几个维度的排列组合。把第一个例子跑通,后面的都是变体。
本文地址:http://www.79wt.cn/news/710f1099279.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。