广告

原创 Python 简单爬虫(1)使用xpath页面解析技术

2017-10-22 09:33 568 0 分类: 软件与OS


       这次要爬取的信息取自于IMDB电影排行榜,网址为:http://www.imdb.cn/imdb250/1

      首先我们先简单获取一下电影的名字,为了定位html的各种元素,给谷歌浏览器装一个 XPath Helper,在工具栏打开它,按住shift 键,把鼠标移动到网页上的你要获取的元素上,就可以获得它的位置信息。

      1、下面我们先尝试获取电影标题的位置


具体代码如下:

from lxml import html
x = html.parse('http://www.imdb.cn/imdb250/1')
titles = x.xpath("//div[@class='honghe-3']/p[@class='bb']/text()")
print("we got %s titles" % len(titles))
for title in titles:
       print(title)

输出结果:

we got 30 titles 肖申克的救赎 教父 教父:II 低俗小说 黄金三镖客 蝙蝠侠前传2:黑暗骑士 十二怒汉 辛德勒名单 指环王:王者归来 搏击俱乐部 星球大战Ⅴ:帝国反击战 指环王:护戒使者 飞越疯人院 盗梦空间 好家伙 星球大战IV:新希望 七武士 阿甘正传 黑客帝国 指环王:双塔奇兵 上帝之城 七宗罪 沉默的羔羊 西部往事 卡萨布兰卡 非常嫌疑犯 夺宝奇兵 后窗 美好人生 惊魂记


2、接下来我们获取电影的打分

先定位分数的位置信息

具体代码如下

scores = x.xpath("//div[@class='honghe-2']/span/i/text()")
for score in scores:
     print(score)  

输出结果如下:

9.3 9.2 9.1 9.0 9.0 9.0 8.9 8.9 8.9 8.9 8.8 8.8 8.8 8.8 8.8 8.8 8.8 8.7 8.7 8.7 8.7 8.7 8.7 8.7 8.7 8.7 8.7 8.7 8.7 8.6


3、接下来用一个循环将电影的配图的位置,电影标题,导演信息,得分打印出来

具体代码如下:

groups = x.xpath("//div[@class='honghe']")
for group in groups:
      print(''.join(group.xpath(".//div[@class='hong']/img/@src")))
      print(''.join(group.xpath(".//div[@class='honghe-3']/p[@class='bb']/text()")))
      print("导演: "+''.join(group.xpath(".//div[@class='honghe-4 clear']/p[3]/span/text()")))
      print("得分: "+''.join(group.xpath(".//div[@class='honghe-2']/span/i/text()")))

输出结果如下:

肖申克的救赎 导演: 弗兰克·达拉邦特 Frank Darabont 得分: 9.3
http://posters.imdb.cn/upload/2016/08/26/NGiDp8KS3_1472192982.jpg
教父 导演: 弗朗西斯·福特·科波拉 Francis Ford Coppola 得分: 9.2
http://posters.imdb.cn/upload/1980/07/07/RgYKt147N_1180702311.jpg
教父:II 导演: 弗朗西斯·福特·科波拉 Francis Ford Coppola 得分: 9.1
http://posters.imdb.cn/upload/2003/03/08/1Bhi80Jxx_1177989811.jpg
低俗小说 导演: 昆汀·塔伦蒂诺 Quentin Tarantino 得分: 9.0
http://posters.imdb.cn/upload/1999/03/29/62RLIR9saC_1148432357.jpg
黄金三镖客 导演: 塞尔吉奥·莱昂内 Sergio Leone 得分: 9.0
http://posters.imdb.cn/upload/2003/03/09/H53YRAY3c_1185655314.jpg
蝙蝠侠前传2:黑暗骑士 导演: 未知 得分: 9.0
http://posters.imdb.cn/upload/1981/07/02/IJomLjvZq_1184375616.jpg
十二怒汉 导演: 西德尼·吕美特 Sidney Lumet 得分: 8.9
http://posters.imdb.cn/upload/1993/11/30/3G9eR4Qe0m_1148433560.jpg
辛德勒名单 导演: 斯蒂芬·斯皮尔伯格 Steven Spielberg 得分: 8.9
http://posters.imdb.cn/upload/2003/12/01/A6kPq4OM8m_1148433000.jpg
指环王:王者归来 导演: 彼得·杰克逊 Peter Jackson 得分: 8.9
http://posters.imdb.cn/upload/2016/08/22/zZYTGWIlI_1471858567.jpg
搏击俱乐部 导演: 大卫·芬奇 David Fincher 得分: 8.9
http://posters.imdb.cn/upload/2005/02/25/FvpoLHox7_1261978983.jpg
星球大战Ⅴ:帝国反击战 导演: 伊文·克什纳 Irvin Kershner 得分: 8.8
http://posters.imdb.cn/upload/2001/12/10/0OZLVvKvdo_1148432167.jpg
指环王:护戒使者 导演: 彼得·杰克逊 Peter Jackson 得分: 8.8
http://posters.imdb.cn/upload/1975/11/19/vPcUO8N1JX_1148432618.jpg
飞越疯人院 导演: 米洛斯·福尔曼 Milos Forman 得分: 8.8
http://posters.imdb.cn/upload/2001/03/18/2bDnAdeIN_1261504270.jpg
盗梦空间 导演: 克里斯托弗·诺兰 Christopher Nolan 得分: 8.8
http://posters.imdb.cn/upload/1990/09/12/zr0dECk4VD_1148432487.jpg
好家伙 导演: 马丁·斯科塞斯 Martin Scorsese 得分: 8.8
http://posters.imdb.cn/upload/1977/05/25/qiobjJQrsg_1148433786.jpg
星球大战IV:新希望 导演: 乔治·卢卡斯 George Lucas 得分: 8.8
http://posters.imdb.cn/upload/1993/04/29/SUwvkCYhEY_1148432352.jpg
七武士 导演: 黑泽明 Akira Kurosawa 得分: 8.8
http://posters.imdb.cn/upload/1994/06/23/7yM8yMKOF1_1148432608.jpg
阿甘正传 导演: 罗伯特·泽米基斯 Robert Zemeckis 得分: 8.7
http://posters.imdb.cn/upload/1999/03/31/0bDwLci3Qx_1148433202.jpg
黑客帝国 导演: 安迪·沃卓斯基 Andy Wachowski|拉娜·沃卓斯基 Lana Wachowski 得分: 8.7
http://posters.imdb.cn/upload/2002/12/05/wYy6gEZVON_1148433036.jpg
指环王:双塔奇兵 导演: 彼得·杰克逊 Peter Jackson 得分: 8.7
http://posters.imdb.cn/upload/2002/05/18/gAotRuG7Pm_1148433878.jpg
上帝之城 导演: 费尔南多·梅里尔斯 Fernando Meirelles|卡提亚·路德 Kátia Lund 得分: 8.7
http://posters.imdb.cn/upload/1998/04/03/rYmevemmD_1176897330.jpg
七宗罪 导演: 大卫·芬奇 David Fincher 得分: 8.7
http://posters.imdb.cn/upload/1991/01/30/9pu3UM6c3p_1148432319.jpg
沉默的羔羊 导演: 乔纳森·戴米 Jonathan Demme 得分: 8.7
http://posters.imdb.cn/upload/1999/03/29/lTlZlsNVbn_1148433582.jpg
西部往事 导演: 塞尔吉奥·莱昂内 Sergio Leone 得分: 8.7
http://posters.imdb.cn/upload/2003/03/08/A4h3fojJNs_1148432891.jpg
卡萨布兰卡 导演: 迈克尔·柯蒂兹 Michael Curtiz 得分: 8.7
http://posters.imdb.cn/upload/1995/07/19/PNuDIlc9e3_1148432991.jpg
非常嫌疑犯 导演: 布莱恩·辛格 Bryan Singer 得分: 8.7
http://posters.imdb.cn/upload/1981/06/12/hj0ONIGMQI_1148432293.jpg
夺宝奇兵 导演: 斯蒂芬·斯皮尔伯格 Steven Spielberg 得分: 8.7
http://posters.imdb.cn/upload/1992/05/04/oVAGCyWgmx_1148433997.jpg
后窗 导演: 阿尔弗雷德·希区柯克 Alfred Hitchcock 得分: 8.7
http://posters.imdb.cn/upload/2006/02/20/CTEqb7WpZo_1148432535.jpg
美好人生 导演: 弗兰克·卡普拉 Frank Capra 得分: 8.7
http://posters.imdb.cn/upload/2002/03/13/VEIZwLc3f_1230042901.jpg
惊魂记 导演: 阿尔弗雷德·希区柯克 Alfred Hitchcock 得分: 8.6

4、实现翻页功能

代码如下

from time import sleep
from lxml import html

titles = []
base_url = "http://www.imdb.cn{}"
next_page = "http://www.imdb.cn/imdb250/1"

next_button_xpath = "//div[@class='page-1 clear']/a[2]/@href"

headline_xpath = "//div[@class='honghe-3']/p[@class='bb']/text()"

while len(titles) < 260 and next_page:
    dom = html.parse(next_page)
    headlines = dom.xpath(headline_xpath)
    print("Get {} titles from url {}".format(len(headlines),next_page))
    titles += headlines
    next_pages = dom.xpath(next_button_xpath)
    if next_pages:
             next_page = base_url.format(next_pages[0])
    else:
             print("No next button found\n")
              next_page = None

sleep(3)

print("Total %s movies collected,top 25 titles:" %len(titles))

for title in titles:
          print(title)


输出如下

Get 30 titles from url http://www.imdb.cn/imdb250/1
Get 30 titles from url http://www.imdb.cn/imdb250/2
Get 30 titles from url http://www.imdb.cn/imdb250/3
Get 30 titles from url http://www.imdb.cn/imdb250/4
Get 30 titles from url http://www.imdb.cn/imdb250/5
Get 30 titles from url http://www.imdb.cn/imdb250/6
Get 30 titles from url http://www.imdb.cn/imdb250/7
Get 30 titles from url http://www.imdb.cn/imdb250/8
Get 7 titles from url http://www.imdb.cn/imdb250/9
Get 30 titles from url http://www.imdb.cn/imdb250/1
Total 277 movies collected,top 25 titles: 肖申克的救赎 教父 教父:II 低俗小说 黄金三镖客 蝙蝠侠前传2:黑暗骑士 十二怒汉 辛德勒名单 指环王:王者归来 搏击俱乐部 星球大战Ⅴ:帝国反击战 指环王:护戒使者 飞越疯人院 盗梦空间 好家伙 星球大战IV:新希望 七武士 阿甘正传 黑客帝国 指环王:双塔奇兵 上帝之城 七宗罪 沉默的羔羊 西部往事 卡萨布兰卡 非常嫌疑犯 夺宝奇兵 后窗 美好人生 惊魂记 杀手莱昂 日落大道 美国X档案 现代启示录 终结者2:审判日 拯救大兵瑞恩 记忆碎片 城市之光 奇爱博士 异形 摩登时代 千与千寻 西北偏北 回到未来 美丽人生 钢琴家 闪灵 公民凯恩 无间行者 M就是凶手 光荣之路 双重赔偿 蝙蝠侠:黑暗骑士崛起 异形2 出租车司机 美国丽人 绿里奇迹 角斗士 无法触碰 机器人总动员 他人的生活 玩具总动员3 致命魔术 发条橙 阿拉伯的劳伦斯 天使艾美丽 杀死一只知更鸟 落水狗 从海底出击 狮子王 天堂电影院 星球大战VI:绝地武士归来 碧血金沙 第三个人 美国往事 梦之安魂曲 美丽心灵的永恒阳光 全金属外壳 老男孩 勇敢的心 洛城机密 偷自行车的人 唐人街 雨中曲 幽灵公主 巨蟒与圣杯 大都会 热情似火 罗生门 莫扎特 2001:太空漫游 彗星美人 控方证人 骗中骗 公寓 萤火虫之墓 不可饶恕 夺宝奇兵3:圣战奇兵 愤怒的公牛 桂河大桥 虎胆龙威 蝙蝠侠前传:侠影之谜 用心棒 纳德和西敏:一次别离 无耻混蛋 黄昏双镖客 偷拐抢骗 玩具总动员 大逃亡 史密斯先生到华盛顿 飞屋环游记 帝国的毁灭 码头风云 潘神的迷宫 将军号 第七封印 盗火线 象人 弃儿的故事 马耳他雄鹰 银翼杀手 疤面煞星 野草莓 丽贝卡 老爷车 生之欲 冰血暴 乱
大人物勒布斯基 历劫佳人 淘金记 猎鹿人 铁手卢克 老无所依 一夜风流 赌城风云 恶魔 心灵捕手 第六感 列车上的陌生人 野战排 怪形 大白鲨 罪恶之城 虎豹小霸王 猜火车 杀死比尔:第一卷 绿野仙踪 勇士 愤怒的葡萄 谜一样的双眼 卢旺达饭店 正午 飘
安妮·霍尔 龙猫 海底总动员 V字仇杀队 电话情杀案 美人计 复仇者联盟 驯龙高手 荒野生存 布莱恩的一生 猎人的夜晚 血色将至 电视台风云 终结者 宾虚 百万宝贝 夜长梦多 伴我同行 国王的演讲 黄金时代 四百击 土拨鼠日 十二只猴子 玛丽和马克思 哈尔的移动城堡 炎热的下午 唐尼·达克 人格面具 爱情是狗娘 谍影重重3 甘地传 杀手 美丽心灵 毕业生 黑天鹅 公主新娘 灵欲春宵 八部半 江湖浪子 大路 洛奇 桃色血案 双虎屠龙 贫民窟的百万富翁 驱魔人 夺魂索 以父之名 巴里·林登 日落黄沙 满洲候选人 怪物公司 17号囚房 无间道 楚门的世界 三个白痴 杀人回忆 加勒比海盗:黑珍珠号的诅咒 心中的小星星 罗马假日 潜行者 足迹 芬尼与亚历山大 派的生活 哈利·波特与死亡圣器(下) 侏罗纪公园 荒野大镖客 叶问 星际迷航 焦土之城 欲望号街车 禁闭岛 第九区 霍比特人 美食总动员 怒火青春 雨人 潜水钟与蝴蝶 西线无战事 风之谷 罗斯玛丽的婴儿 美女与野兽 巴比龙 神秘河 哈维 日出之前 忠犬八公的故事 冬去春又来 那一晚 不可触犯 肖申克的救赎 教父 教父:II 低俗小说 黄金三镖客 蝙蝠侠前传2:黑暗骑士 十二怒汉 辛德勒名单 指环王:王者归来 搏击俱乐部 星球大战Ⅴ:帝国反击战 指环王:护戒使者 飞越疯人院 盗梦空间 好家伙 星球大战IV:新希望 七武士 阿甘正传 黑客帝国 指环王:双塔奇兵 上帝之城 七宗罪 沉默的羔羊 西部往事 卡萨布兰卡 非常嫌疑犯 夺宝奇兵 后窗 美好人生 惊魂记

5、保存到文

with open('IDMB_hot_movies.txt','wb') as out:
    out.write('\n'.join(titles).encode('utf-8'))
广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1  ...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.    ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产...
我要评论
0
0
广告
关闭 热点推荐上一条 /1 下一条