今天练习网络爬虫,爬取豆瓣电影Top 250,其中每部电影有排名、评分、电影名、导演等信息,分布在不同的标签下面,而每部电影的所有信息都在一个大的<div>标签下,因此需要获取子元素的内容。查了一下只看到有人用循环嵌套的方法遍历子元素,感觉略麻烦,后来发现.contents属性可以方便地获取子元素内容,因此采用。
首先爬取第一页的内容,将所有电影的信息存入targets,用for循环遍历(使用break的目的是只研究第一部电影的信息,以节省时间):

import requests
import re
import bs4def parse_one_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'}res = requests.get(url, headers=headers)soup = bs4.BeautifulSoup(res.text, 'html.parser')targets = soup.find_all('div', class_='item')for each in targets:print(each)breakdef main():global top250top250 = []url = 'https://movie.douban.com/top250?start={}&filter='.format(25 * 0)parse_one_page(url)if __name__ == '__main__':main()

运行结果如下:

<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/>
</a>
</div>
<div class="info">
<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港)  /  刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim
Robbins /...<br/>1994 / 美国 / 犯罪 剧情</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span content="10.0" property="v:best"></span>
<span>1338214人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>

可以对比这一部分的源代码:

<div class="item"><div class="pic"><em class="">1</em><a href="https://movie.douban.com/subject/1292052/"><img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class=""></a></div><div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救赎</span><span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span><span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span></a><span class="playable">[可播放]</span></div><div class="bd"><p class="">导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情</p><div class="star"><span class="rating5-t"></span><span class="rating_num" property="v:average">9.6</span><span property="v:best" content="10.0"></span><span>1338214人评价</span></div><p class="quote"><span class="inq">希望让人自由。</span></p></div></div></div>

可以看出,第一部电影的信息被打印了出来,要想获取具体某一项信息,尝试调用.contents属性print(each.contents)

['\n', <div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/>
</a>
</div>, '\n', <div class="info">
<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港)  /  刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim
Robbins /...<br/>1994 / 美国 / 犯罪 剧情</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span content="10.0" property="v:best"></span>
<span>1338863人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>, '\n']

发现得到一个list,每一个子元素成为list的一个元素,两两之间有换行符,list收尾也是换行符。由此推断<div class="pic">子元素为each.contents[1],由此类推,电影排名为each.contents[1].contents[1].text,电影名为each.contents[3].contents[1].contents[1].contents[1].text,电影评分为each.contents[3].contents[3].contents[3].contents[3].text,等等。最后,将每一部电影的信息append到列表中,并写入Excel。完整代码如下:

import requests
import re
import bs4
import openpyxldef parse_one_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'}res = requests.get(url, headers=headers)soup = bs4.BeautifulSoup(res.text, 'html.parser')targets = soup.find_all('div', class_='item')for each in targets:rank = each.contents[1].contents[1].textname = each.contents[3].contents[1].contents[1].contents[1].textrating = each.contents[3].contents[3].contents[3].contents[3].texttry:quote = each.contents[3].contents[3].contents[5].contents[1].textexcept:quote = ''s = each.contents[3].contents[3].contents[1].textpattern = '导演: (.*?)\s主演: (.*?)...\s+(\d+)\s/\s(.*?)\s/\s(.*)\s+'try:director = re.search(pattern, s).group(1)except:director = ''try:hero = re.search(pattern, s).group(2)except:hero = ''try:year = re.search(pattern, s).group(3)except:year = ''try:region = re.search(pattern, s).group(4)except:region = ''try:genre = re.search(pattern, s).group(5)except:genre = ''top250.append([rank, name, rating, year, region, genre, director, hero, quote])#breakdef main():global top250top250 = []for i in range(10):url = 'https://movie.douban.com/top250?start={}&filter='.format(25 * i)parse_one_page(url)wb = openpyxl.Workbook()ws = wb.activews.append(['rank', 'name', 'rating', 'year', 'region', 'genre', 'director', 'hero', 'quote'])for each in top250:ws.append(each)wb.save('douban.xlsx')if __name__ == '__main__':main()

以上代码鲁棒性还不够好,原因是Top 250的页面显示的信息有限,有时候导演名字过长,“演员”二字显示不完整,导致正则表达式匹配不上,于是演员等信息就不显示了。更好的方案是获取每一部电影的URL,然后逐一解析。

爬取的网页,获取子元素内容的方法相关推荐

  1. NCrawler爬取中文网页时乱码问题的解决方法

    在使用.NET下的NCrawler爬取网页信息时,如果网页以GBK或GB2312进行编码,则下载的内容会出现乱码. 查找原因,发现在NCrawler.HtmlProcessor项目下HtmlDocum ...

  2. jq 获取含类的子集_jquery获取子元素

    Jquery获取子元素的方法有2种,分别是children()方法和find()方法. 下面我们分别来使用这两种方法,看看它们有何差异. children()方法:获取该元素下的直接子集元素 find ...

  3. Python爬虫【二】爬取PC网页版“微博辟谣”账号内容(selenium同步单线程)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  4. Python爬虫【四】爬取PC网页版“微博辟谣”账号内容(selenium多线程异步处理多页面)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  5. Python爬虫【三】爬取PC网页版“微博辟谣”账号内容(selenium单页面内多线程爬取内容)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  6. python动态页面元素爬取_爬取动态网页python+Web kit

    上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...

  7. 一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文

    一步一步学习专栏:静态网页爬取 阿巴阿巴阿巴 大家好,我是猕猴tou儿,我又回来了,这篇帖子将以猫眼电影榜单top100榜为例讲解爬取静态网址的基本思路与爬取方法. 环境 这也是我们的第一步: imp ...

  8. java爬虫系列(二)——爬取动态网页

    准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...

  9. 爬虫 -----beautifulsoup、Xpath、re (二)附爬取丁香园用户名以及回复内容

    目录 1.Xpath简介 1.1使用流程: 1.2Xpath常用的路径表达式 1.3 使用lxml解析 2 实战:爬取丁香园-用户名和回复内容 2.1 获取url的html 2.2 lxml解析htm ...

最新文章

  1. stylus 在静态页面上的使用经验
  2. OpenStack环境下nova resize报ssh连接错误
  3. optee3.8 qemu_v8的环境搭建篇
  4. C语言循环遍历文件夹查找文件内容(搜素/proc文件夹下的内容获取进程pid)
  5. php7插件开发,php7.2.6 插件fileinfo的安装
  6. 虚拟机环境下DPDK运行时的一些错误解决
  7. Brainstorm-the walkthrough example: Image Classification
  8. UVA - 11246 - K-Multiple Free set(容斥原理)
  9. 零基础入门深度学习(4) - 卷积神经网络
  10. 输出结果 配置_经典架构新玩法:用单端仪表放大器实现全差分输出
  11. Elasticsearch 节点磁盘使用率过高,导致ES集群索引无副本
  12. 如何快速在 Springboot 中集成拦截器? | 原力计划
  13. WinDriver_资料
  14. 二十、调度器、预选策略以及优选函数
  15. 【学习笔记之计算机组成原理篇】计算机系统概论
  16. 【UCIe】UCIe D2D Adapter 介绍
  17. 大话UWB技术之核心命脉:TDOA与TOF
  18. Tournament Chart【模拟+vector+map+string】
  19. 一篇文章看懂:量化交易
  20. python随机抽取5张扑克牌,判断是否为顺子

热门文章

  1. 去掉导航栏下边的横条
  2. go json技巧以及强大的三方json库(jsoniter)
  3. 工控主板启动不显示的故障原因
  4. 【GoLang】go 微服务框架 Web框架学习资料
  5. Matlab2018安装成功后,打开出现licensing error:-8523解决方法
  6. 土豆网的后舍男孩挺搞笑的
  7. python画地图经纬度_Python 百度API 画出美美哒热力地图(代码 数据)
  8. 【Demllie航天】宇宙飞船与火箭,着陆与回收
  9. 如何购买腾讯云服务器(帮助文档)
  10. 金沙数据-《大话搜索引擎》之开篇