今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习。话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的。

python环境:python3.5

先看看网页的样子

豆瓣电影网站链接

我们下面将要对电影的名字、链接、评分、评价人数和一句话描述这些信息进行提取
1、检查并复制电影名字的xPath信息

电影《肖申克的救赎》的xPath信息如下:
//*[@id=”content”]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
按照爬虫的代码套路来一波

  1. from lxml import etree
  2. import requests
  3.  
  4. def get_1_name():
  5. '''
  6. 爬取豆瓣top250电影的第1个电影的名字
  7. :return:
  8. '''
  9. url = 'https://movie.douban.com/top250' # #豆瓣top250网址
  10. data = requests.get(url).text # #得到html内容
  11. s = etree.HTML(data) # #etree.HTML用来解析html内容
  12. xpath_test = '//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]'+'/text()' # #谷歌浏览器中选中文字,右键检查,复制xpath
  13. title = s.xpath(xpath_test)[0] # #列表只有一个元素
  14. print(title)

  

输出结果:

第六行代码最后加[0],是因为不加的话,返回的则会是一个列表,不好看。
2、对同一页的不同电影名字进行提取
根据《肖申克的救赎》同方法对《霸王别姬》、《这个杀手不太冷》和《阿甘正传》的xPath信息比较:

比较可以发现电影名的xPath信息仅仅li后面的序号不一样,并且和电影名的序号一样,所以去掉序号以后,就可以得到通用的xPath信息

//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]

接下来我们把这一页的电影名字个爬下来

  1. from lxml import etree
  2. import requests
  3. url = 'https://movie.douban.com/top250'
  4. data = requests.get(url).text
  5. s = etree.HTML(data)
  6. title = s.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
  7. for movies in title:
  8. print(movies)

输出结果

下面用类似的方法对电影评分进行提取

  1. from lxml import etree
  2. import requests
  3. url = 'https://movie.douban.com/top250'
  4. data = requests.get(url).text
  5. s = etree.HTML(data)
  6. score = s.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
  7. for i in score:
  8. print(i)

输出结果为

接下来要做的是输出电影及对应的评分

  1. from lxml import etree
  2. import requests
  3. url = 'https://movie.douban.com/top250'
  4. data = requests.get(url).text
  5. s = etree.HTML(data)
  6. file = s.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
  7. score = s.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
  8. for i in range(25):
  9.   print("{} {}".format(file[i],score[i]))

输出结果为:

这里我们默认电影名字以及评分都是完整的、正确的信息,这种默认一般情况下是没问题的。但其实是有缺陷的。如果我们少爬了或者多爬了信息,就会发生匹配的错误,那么该怎么避免这种错误呢?
仔细思考下,发现我们若是以电影名字为单位,分别获取对应的信息,那么匹配肯定完全正确。
电影名字的标签肯定在这部电影的框架内,于是我们从电影名字的标签往上找,发现覆盖整部电影的标签,把xPath信息复制下来

//*[@id="content"]/div/div[1]/ol/li[1]

然后我们将整部电影和其他信息的xPath信息进行比较

//*[@id="content"]/div/div[1]/ol/li[1]
//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
//*[@id="content"]/div/div[1]/ol/li[2]/div/div[2]/div[2]/div/span[2]

不难发现电影名和评分的前半部分与整部电影的前半部分是一样的。那我们就可以这样写xPath的方式来定位信息:

file = s.xpath('//*[@id="content"]/div/div[1]/ol/li[1]')
movies_name = div.xpath('./div/div[2]/div[1]/a/span[1]/text()')
movies_score = div.xpath('./div/div[2]/div[2]/div/span[2]/text()')

在实际的代码中体验一下

  1. from lxml import etree
  2. import requests
  3. url = 'https://movie.douban.com/top250'
  4. data = requests.get(url).text
  5. s = etree.HTML(data)
  6. file = s.xpath('//*[@id="content"]/div/div[1]/ol/li[1]')
  7. for div in file:
  8. movies_name = div.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
  9. movies_score = div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
  10. print("{} {}".format(movies_name,movies_score))

输出结果为

上面我们爬取了一部电影的信息,那么怎么爬取这一页的呢?很简单把li后面的[1]去掉就可以了。来看看新的代码

  1. from lxml import etree
  2. import requests
  3. url = 'https://movie.douban.com/top250'
  4. data = requests.get(url).text
  5. s = etree.HTML(data)
  6. file = s.xpath('//*[@id="content"]/div/div[1]/ol/li')
  7. for div in file:
  8. movies_name = div.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
  9. movies_score = div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
  10. print("{} {}".format(movies_name,movies_score))

结果为:

其他信息的提取与之类似,就不在细讲了,代码跑一遍

  1. from lxml import etree
  2. import requests
  3. url = 'https://movie.douban.com/top250'
  4. data = requests.get(url).text
  5. s = etree.HTML(data)
  6. file = s.xpath('//*[@id="content"]/div/div[1]/ol/li')
  7. for div in file:
  8. movies_name = div.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
  9. movies_score = div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
  10. movies_href = div.xpath('./div/div[2]/div[1]/a/@href')[0]
  11. movies_number = div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0].strip("(").strip( ).strip(")")
  12. movie_scrible = div.xpath('./div/div[2]/div[2]/p[2]/span/text()')
  13. print("{} {} {} {} {}".format(movies_name,movies_href,movies_score,movies_number,movie_scrible[0]))

  

结果为:

这样我们就对第一页的信息进行了提取,那么我么怎么把所有的页都提取呢?比较一下不同页的URL

第一页:https://movie.douban.com/top250?start=0
第二页:https://movie.douban.com/top250?start=25
第三页:https://movie.douban.com/top250?start=50
第四页:https://movie.douban.com/top250?start=75
......

URL的变化规律很简单,只是start=()的数字不一样,以25为单位递增,所以写个循环就可以了,下面把整个代码跑一下,所有25页的信息全部提取下来。

  1. from lxml import etree
  2. import requests
  3. import time
  4. for a in range(10):
  5. url = 'https://movie.douban.com/top250?start={}'.format(a*25)
  6. data = requests.get(url).text
  7. # print(data)
  8. s = etree.HTML(data)
  9. file = s.xpath('//*[@id="content"]/div/div[1]/ol/li')
  10. for div in file:
  11. movies_name = div.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
  12. movies_score = div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
  13. movies_href = div.xpath('./div/div[2]/div[1]/a/@href')[0]
  14. movies_number = div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0].strip("(").strip( ).strip(")")
  15. movie_scrible = div.xpath('./div/div[2]/div[2]/p[2]/span/text()')
  16. # time.sleep(1)
  17. if len(movie_scrible)>0:
  18. print("{} {} {} {} {}".format(movies_name,movies_href,movies_score,movies_number,movie_scrible[0]))
  19. else:
  20. print("{} {} {} {}".format(movies_name,movies_href,movies_score,movies_number))

  

结果为

这只是一部分截图,整体的包含了250部电影。
注:这里加了个if语句,是因为发现有的电影没有一句话描述。Ok了,这个爬虫很简单,也是我刚开始学习xPath,适合新手学习
---------------------
作者:云南省高校数据化运营管理工程研究中心
来源:CSDN
原文:https://blog.csdn.net/m0_37788308/article/details/80378042
版权声明:本文为博主原创文章,转载请附上博文链接!

零基础爬虫----python爬取豆瓣电影top250的信息(转)的更多相关文章

  1. 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

    学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...

  2. python爬取豆瓣电影Top250(附完整源代码)

    初学爬虫,学习一下三方库的使用以及简单静态网页的分析.就跟着视频写了一个爬取豆瓣Top250排行榜的爬虫. 网页分析 我个人感觉写爬虫最重要的就是分析网页,找到网页的规律,找到自己需要内容所在的地方, ...

  3. Python 爬取豆瓣电影Top250排行榜,爬虫初试

    from bs4 import BeautifulSoup import openpyxl import re import urllib.request import urllib.error # ...

  4. Python爬取豆瓣电影top

    Python爬取豆瓣电影top250 下面以四种方法去解析数据,前面三种以插件库来解析,第四种以正则表达式去解析. xpath pyquery beaufifulsoup re 爬取信息:名称  评分 ...

  5. Python爬虫入门:爬取豆瓣电影TOP250

    一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...

  6. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

  7. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  8. 利用Python爬取豆瓣电影

    目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...

  9. 第一个nodejs爬虫:爬取豆瓣电影图片

    第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require( ...

随机推荐

  1. jQuery-1.样式篇---属性与样式

    jQuery的属性与样式之.attr()与.removeAttr() 每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标 ...

  2. mybatis(一、原理,一对多,多对一查询)

    MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...

  3. JAVA基础部分复习(七、JAVA枚举类型使用)

    /** * java中的枚举 * 枚举(enum),是指一个经过排序的.被打包成一个单一实体的项列表.一个枚举的实例可以使用枚举项列表中任意单一项的值. * 枚举在各个语言当中都有着广泛的应用,通常用 ...

  4. InstallShield-常用prq文件的下载地址

    VC 2010 redist X86: http://saturn.installshield.com/is/prerequisites/microsoft visual c++ 2010 redis ...

  5. latex之矩阵表示

    $ \begin{matrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{matrix}\quad \begin{ ...

  6. 录制JMeter脚本的方式

    一.使用BadBoy录制JMeter脚本 JMeter和BadBoy下载地址:点击去下载 1.打开BadBoy并输入你要录制脚本的网址 这里我输入百度的网址,可以看到step下已经有一个请求了 2.录 ...

  7. 启动Kernel提示Bad Data CRC

    如上图,我明明将uImage正确写入到里nandflash里面,但启动但时候就是提示bad CRC. 后来我手动执行nand read kernel想看看是不是环境变量里面的命令执行有问题,意外但被我 ...

  8. Netty学习记录

    一.Netty简介 Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性. Netty 是一个 NIO client-s ...

  9. 如何在同一主机中添加多个homestead并行开发

    参考源 https://blog.csdn.net/smm188/article/details/79356150 1,在项目目录 git clone homestead 后(见上面流程中的第四步), ...

  10. 一些有用的Java学习资料

    Better Java,一些好的Java实践 Google Java Style Guide 30个Java编程技巧 JDK8新增语法特性简介,对Java8中新增的函数接口.Lambda表达式.方法引 ...