前篇全片都是生硬的理论使用,今天就放个静态爬取的实例让大家体验一下BeautifulSoup的使用,了解一些背后的原理。
顺便在这引入静态网页的概念——静态网页是指一次性加载所有内容的网页,爬虫一次请求便能得到所有信息,对爬虫非常友好,适合练手
豆瓣top250电影信息爬取这是一个老掉牙的经典实例了,但越是经典,越有示范性作用,最重要的一点是,它是静态的。 给出网站:https://movie.douban.com/top250 打开F12/右键检查第一个电影,分析源码先,发现每个
我们来爬取每部电影的图片,名称,导演演员,类型,评分,和它的一句话总结,继续对
布置好伪装后就可一开始根据每个
- 图片链接是的上上个兄弟标签的孙子
的src属性的值
- 电影名有多个,都在
标签里,用get_text()把它们串起来- 导演演员是
标签的第一段字符串
- 类型是
标签的第二段字符串
- 评分和评分人数都在
标签里,又用get_text()串起来- 一句话总结直属于标签
- html中的&NBSP(实际上是小写,这里大写避免markdown识别)对应字符串中的\xa0,可用replace方法替换掉
url = 'https://movie.douban.com/top250' headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'} r=requests.get(url,headers=headers) soup = BeautifulSoup(r.text,'lxml') for each in soup.find_all('div',class_='info'): img_url = each.previous_sibling.previous_sibling.a.img['src']#图片链接 '''with open('*.jpg','wb') as img:#还可以顺便下载回来,名字自起 img.write(requests.get(img_url,headers=headers).content)''' title=each.find('div',class_='hd').get_text(strip=True).replace('\xa0','')#标题 actor = list(each.find('p',class_='').strings)[0].strip().replace('\xa0','')#导演演员 type_ = list(each.find('p',class_='').strings)[1].strip().replace('\xa0','')#类型 score = each.find('div',class_='star').get_text('/',strip=True)#评分及人数 quote = each.find('span',class_='inq').string#一句话总结 print([img_url,title,actor,type_,score,quote])#这里只简单打出来看下,怎样存储由你来决定
但是这样只有25部电影啊,是的,'https://movie.douban.com/top250'指向第一页,我们现在只爬了一页,其实还有9页还没爬啊,这是就要构造网址了。
我们点到第二页,发现网址变成了https://movie.douban.com/top2...,第三页start条件值变成50,我们可以得出结论,每下一页,start条件值就加25。第一页start=0,第二页start=25.....第十页start=225。这样就可以循环构造网页并爬取了,这交给读者实现 下面笔者提供另一种思路:网页不是有下一页的按钮吗,右键检查一下,发现它已经包含了要构造的部分了,是一个属性值,提取出来接到原网址上即得到下一页的网址,这样能完全爬取所有页数,不用像上面一样设置循环次数。
贴上完整代码
import requests from bs4 import BeautifulSoup ''' 想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载! ''' url = 'https://movie.douban.com/top250' with open('douban.txt','w',encoding='utf-8') as f: while url : headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'} r=requests.get(url,headers=headers) soup = BeautifulSoup(r.text,'lxml') for each in soup.find_all('div',class_='info'): img_url = each.previous_sibling.previous_sibling.a.img['src'] title=each.find('div',class_='hd').get_text(strip=True).replace('\xa0','') actor = list(each.find('p',class_='').strings)[0].strip().replace('\xa0','') #将生成器list化后索引,strip()去除两边空格再用空字符替换  type_ = list(each.find('p',class_='').strings)[1].strip().replace('\xa0','') score = each.find('div',class_='star').get_text('/',strip=True) if each.find('span',class_='inq'):#注意有部电影没有总结,也就没有标签这里用if检测一下防止None使用string方法报错 quote = each.find('span', class_='inq').string else: quote = '没有总结哦' print([img_url,title,actor,type_,score,quote]) try:#到最后一页时没有下一页按钮,会报TypeError,这时用try语句让url=None使while循环停止 url = 'https://movie.douban.com/top250' + soup.find('span',class_='next').a['href'] except TypeError: url = None
关注打赏最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
- 电影名有多个,都在


微信扫码登录