Python爬虫超详细讲解(零基础入门,老年人都看得懂)
发布时间:2026-02-13 12:37 浏览量:2
豆瓣Top250爬下来了,代码跑通了,没被封。
我按大纲第三周的要求,写了完整脚本,边写边改,光调试请求头和延时就花了两天。
最开始以为只要requests.get一下,BS4一find,就能把数据扒出来。结果第一次运行,豆瓣直接返回403。翻了下网页源码,发现连电影名都没渲染在HTML里——原来评分和简介是JS动态加的,但片名和链接还在静态HTML里。我就只抓这俩,不碰动态部分,老老实实绕开。
robots.txt我真去看了,https://movie.douban.com/robots.txt里写着Allow: /top250,说明它允许爬。我就把这行加进代码里,做个小检查:如果返回不是200,程序直接停。不是装样子,是真怕踩线。
User-Agent我懒得手动写十个,用fake-useragent库随机取一个。它有时候会连不上,我就加了个备用字符串,比如Mozilla/5.0 (Windows NT 10.0; Win64; x64)…这种标准格式,不是胡编的,是从浏览器复制来的。timeout设成5秒,超时就重试一次,再不行就跳过这一页。不卡死,不硬刚。
分页地址是有规律的:https://movie.douban.com/top250?start=0&filter=,start每次+25。我用range(0, 250, 25)生成十页,for循环跑。每页之间sleep(1.2)秒,不是整数,避免被识别成固定节奏。这个数是试出来的——1秒有时被限速,1.5秒又太磨蹭,1.2刚好。
解析的时候没用正则。标题用soup.find('div', class_='hd').a.span.text.strip,但有些标题带/n或\xa0空格,我就统一replace('\xa0', ' ').strip。评分那个字段我干脆不要了,因为不在静态HTML里,硬扒JS太费劲,也不合规。简介也一样,不碰。只留片名和链接,够用。
CSV保存前,我把每条数据转成字典,用csv.DictWriter写。header顺序固定,字段名全用英文小写,比如title, url。没存中文列名,省得Excel打不开。编码用utf-8-sig,Windows上双击就能正常打开,不用再转格式。
异常我分三类抓:requests.exceptions.RequestException管网络问题;AttributeError管BS4找不到标签(比如某页结构突变);UnicodeEncodeError管特殊字符写不进文件。每种都print一句提示,比如“第7页标题缺失,跳过”,不报错中断,继续往下跑。
日志没用logging模块,就开了个log.txt,每次写入时间+页码+状态,比如“2024-05-12 14:23:01 | page 3 | ok”。不花里胡哨,能查就行。
我测了三次:第一次漏了session复用,豆瓣返回503;第二次忘了设headers里的Accept,返回乱码;第三次sleep写成time.sleep(1),没加小数点,被限速两分钟。改完才跑通全量250条,csv里共252行(含header),数据全对。
fake-useragent在公司内网偶尔报错,说连不上ua网站。我直接把它删了,换回固定几个UA轮着用,加个random.choice。工具是为人服务的,不是反过来。
代码里没写密码、没存cookie、没登录、没点任何按钮。全程GET请求,没碰POST,没模拟点击,没跑JS。豆瓣首页右上角写着“未经许可,请勿转载”,我就只存本地,不发群、不传云盘、不搞分享。
中间遇到一次IP被短暂限制,等了四分钟自动恢复。我没换代理,也没买IP池,就停掉脚本,喝了杯水,回来再跑。爬虫不是比赛,没必要争那一分钟。
最后生成的csv,我用Excel打开扫了一遍:片名没乱码,链接能复制粘贴打开,序号从1到250对得上。没少条,没重复,没错位。
我把代码放在一个叫douban_simple.py的文件里,327行,注释比代码还多。每段上面都写着“这行干啥”“为啥这么写”“不这么写会怎样”。不是为了好看,是怕下周自己都看不懂。
学爬虫真没那么玄。就是看懂网页结构,照着协议发请求,出错了就查状态码,解析失败就看源码,保存不了就换编码。没有什么黑科技,也没有捷径。
我写完试了两遍,确认能跑,就关了编辑器。