[Python] 豆瓣电影top250爬虫
1.分析
<li><div class="item">电影信息</div></li>
每个电影信息都是同样的格式,毕竟在服务器端是用循环生成的html,这样解析出电影的信息就很简单了
豆瓣电影top250的翻页也很简单,直接就在url上修改一个start就行了,start代表这一页从start+1开始
比如 https://movie.douban.com/top250?start=0&filter=, 就是top1到top25,每页25部电影,翻页把start+=25就行了,一直加到225
2.获取网页的html
使用python内置的urllib库
不过得到的网页中并没有中文,而是会出现这样的字符串
\xe8\xae\xa9\xe5\xa5\xbd\xe7\x94\xb5\xe5\xbd\xb1\xe6\x9d\xa5\xe6\x89\xbe\xe4\xbd\xa0
这是中文的utf-8编码的16进制版本
先将\x去除,变成
e8aea9e5a5bde794b5e5bdb1e69da5e689bee4bda0
然后每6位是一个中文字符
E8 AE A9 让
E5 A5 BD 好
E7 94 B5 电
。。。
全文是【让好电影来找你】
可以在这个网站上输入16进制的UTF-8编码来查找对应字符
def GetHtml(url):
print('Url : '+url)
f = request.urlopen(url.format(start))
data = f.read()
htmls.append(data.decode('utf-8'))
3.解析网页
简单提下XPath的语法
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
先解析出<div class="item">,再对这个div中的内容进行第二次解析
这里值得注意的是打印一个element内的html要用etree.tostring()
tree = etree.HTML(str)
result = tree.xpath('//div[@class="item"]') //获取所有<div class="item">元素
print(etree.tostring(result[0], encoding='unicode')) //随便打印一个
打印出来的就是这样的
<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.jpg" 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"> / 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 class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"/>
<span>996499人评价</span>
</div> <p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
以上<div class="item">已经拿到了,开始进行第二次解析(可以先用个list把这些div存起来,然后再弄个线程做第二次的解析,那是以后的事了,这里先不管)
记录下这里踩的坑
print(result[0].xpath('//img/@src')) //会返回整个页面的img的src
这个奇怪的问题简直了,我甚至觉得是这个包的bug,我从result[0]那么一小段html用xpath查东西居然能查到整个html的,让我觉得我虽然是用result[0]调用的xpath,但内部没准根本不care谁调用的,一律使用最开始etree.HTML() 的到的这个对象调用xpath
我的解决办法是改下xpath,指定从div开始找,或者是用 “."表示从当前节点开始找
print(result[0].xpath('div//img/@src'))
print(result[0].xpath('.//img/@src'))
下面这段代码中的XPath可能不够简洁,但It's just works,毕竟这是第一个版本,随着我对python的熟练,还会继续改动
主要是将一个p标签下的字符串连接起来并去除空格,转换各种特殊字符
需要注意的是XPath返回的基本都是list类型的,很多博客里都直接调方法都没加下标取值,天知道是不是版本不一样
def ProcessHtml(html):
tree = etree.HTML(html)
items = tree.xpath('//div[@class="item"]') for item in items:
index = item.xpath('div//em/text()')[0]
src = item.xpath('div//img/@src')[0]
info = item.xpath('.//div[@class="bd"]/p')[0].xpath('string(.)').strip().replace(' ','').replace('\xa0',' ').replace('\n',' ')
title = item.xpath('.//div[@class="hd"]/a')[0].xpath('string(.)').strip().replace(' ','').replace('\xa0',' ').replace('\n',' ')
star = item.xpath('.//span[@class="rating_num"]/text()')[0]
print ('''%s
%s
%s
%s
%s
''' % (index,title,info,star,src))
完整代码https://github.com/arcsinw/project_douban
参考链接
scrapy xpath 从response中获取li,然后再获取li中img的src
[Python] 豆瓣电影top250爬虫的更多相关文章
- 记一次python爬虫实战,豆瓣电影Top250爬虫
import requests from bs4 import BeautifulSoup import re import traceback def GetHtmlText(url): for i ...
- 一个豆瓣电影Top250爬虫
一个爬虫 这是我第一次接触爬虫,写的第一个爬虫实例. https://movie.douban.com/top250 模块 import requests #用于发送请求 import re #使用正 ...
- 练习:一只豆瓣电影TOP250的爬虫
练习:一只豆瓣电影TOP250爬虫 练习:一只豆瓣电影TOP250爬虫 ①创建project ②编辑items.py import scrapyclass DoubanmovieItem(scrapy ...
- python爬虫 Scrapy2-- 爬取豆瓣电影TOP250
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Python爬虫----抓取豆瓣电影Top250
有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...
- Python小爬虫——抓取豆瓣电影Top250数据
python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...
- Python爬虫入门:爬取豆瓣电影TOP250
一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...
- 【Python爬虫】:使用高性能异步多进程爬虫获取豆瓣电影Top250
在本篇博文当中,将会教会大家如何使用高性能爬虫,快速爬取并解析页面当中的信息.一般情况下,如果我们请求网页的次数太多,每次都要发出一次请求,进行串行执行的话,那么请求将会占用我们大量的时间,这样得不偿 ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
随机推荐
- hdu-6579 Operation
题目链接 Operation Problem Description There is an integer sequence a of length n and there are two kind ...
- 【CF #541 D】 Gourmet choice
link:https://codeforces.com/contest/1131 题意: 给定一些大小比较,输出排名. 思路: 这道题我用的是拓扑排序,又因为有等于号的存在,我用了并查集. 结束后这道 ...
- CH 5101 最长公共上升子序列
题目传送门 题解:F[i][j] 表示 对于第一个数列枚举到i来说, 第二个数列以j结尾的最大长度是多少. 那么对于更新 F[i] -> F[i+1]来说 如果 a[i+1] == b[j] ...
- CodeForces 311 B Cats Transport 斜率优化DP
题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...
- CF985B Switches and Lamps 思维 第十九
Switches and Lamps time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 【占坑】IDEA从github 导入并运行 SpringBoot + VUE项目
最近工程实践的项目内容是开发一个类似于博客和bbs论坛的系统,在github上找了一个类似的项目可以照着写一写.所以这里先占着坑,等把后端的数据库连接学完了再来填坑. github项目链接:githu ...
- Python中流程控制语句之IF语句
生活中经常遇到的各种选择和判断在程序中也会遇到,比如玩色子,猜大小,比如选择哪条路回家?Python程序中同样也会遇到.IF语句就是用作条件判断的控制语句. 语法一: if 条件: # 引号是将条件与 ...
- Linux基础Day001-001章
运维工作职责:(运行和维护服务器) 1.数据不能丢失, 2.保障网站7*24H正常运行,--一直运行; 3.用户体验要好,--打开网站速度要快 服务器核心硬件(硬盘,内存,CPU) 尺寸: 1U-4. ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...
- GA,RC,Alpha,Beta,Final等软件版本名词释义
对应上图的表格如下: 名词 说明 Alpha α是希腊字母的第一个,表示最早的版本,内部测试版,一般不向外部发布,bug会比较多,功能也不全,一般只有测试人员使用. Beta β是希腊字母的第二个,公 ...