Windows下的安装:
下载地址:https://pypi.python.org/pypi/pyquery/#downloads
下载后安装:
C:/Python27>easy_install E:/python/pyquery-1.2.4.zip
也可以直接在线安装:
C:/Python27>easy_install pyquery
pyquery是一个类似jquery的python库,可以使用像jquery那样的语法来提取网页中的任何数据,这个用于html网页的数据提取和挖掘还是一个很不错的第三方库的。下面我们来看下pyquery的用法有哪些。
从html字符串中提取信息
#!/usr/bin/python# -*- coding: utf-8 -*-from pyquery import PyQuery as pqhtml = '''<html><head> <title>this is title</title></head><body> <p id="hi">Hello, World</p> <p id="hi2">Nihao</p> <div class="class1"> <img src="1.jpg" /> </div> <ul> <li>list1</li> <li>list2</li> </ul></body></html>'''d=pq(html)print d('title') # 相当于css选择器,根据html标签获取元素print d('title').text() # text()方法获取当前选中的文本块print d('#hi').text() # 相当于id选择器,直接根据id名获取元素print d('p').filter('#hi2').text() # 可以根据id或class得到指定元素print d('.class1') # 相当于class选择器print d('.class1').html() # html()方法获取当前选中的html块print d('.class1').find('img').attr('src') # 查找嵌套元素,并选中属性print d('ul').find('li').eq(0).text() # 根据索引号获取多个相同html元素中的某一个print d('ul').children() # 获取所有子元素print d('ul').children().eq(0) #根据索引获取子元素print d('img').parents() # 获取父元素print d('#hi').next() # 获取下一个元素print d('#hi').nextAll() #获取后面全部元素块print d('p').not_('#hi2') # 返回不匹配选择器的元素# 遍历所有匹配的元素for i in d.items('li'): print i.text()print [i.text() for i in d.items('li')] # 遍历用于列表推倒print d.make_links_absolute(base_url='http://www.baidu.com') # 把html文档中的相对路径变为绝对路径
上面的代码段给出了pyquery常用的操作方法。我们先定义了一段html代码,然后利用pyquery的一系列方法对该html代码进行了操作,主要是获取特定的元素以及文本等。当然,pyquery不仅仅能够获取元素,还能进行设置元素属性、增加元素等功能,鉴于我们最常用的就是上面代码中用到的方法,这里就不再对其他方法进行介绍了。
从url或本地html文件中提取信息
当然,pyquery也不仅仅可以解析像上面的html字符串,还可以这样:
d = pq(url='http://www.baidu.com/')
我们可以直接加载一个URL,和上面的操作方法没有任何区别。这种方法默认使用urllib模块进行http请求,但如果你的系统中安装了requests的话,那么就会使用requests来进行http请求,这也就意味着你可以使用requests的任何参数,比如:
pq('http://www.baidu.com/', headers={'user-agent': 'pyquery'})
或者,如果你在你的本地已经有了对应的html文件,那么还可以这样:
d = pq(filename=path_to_html_file)
上面的写法直接指定了本地的html文件,且操作方法仍然与上面的相同。
可以看到,pyquery给我们提供充分的便利性来进行任何元素的选取,就像jquery一样。
利用pyquery抓取豆瓣电影top250
看完了pyquery的语法,我们来看一个实例,抓取豆瓣电影top250。
因为豆瓣反爬虫反的厉害,运行几次就没法再抓了,我只好先用requests把页面下载下来,直接使用pyquery分析页面的方法来提取信息:
from pyquery import PyQuery as pqimport requestshead_req = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36', 'Referer':'https://movie.douban.com/top250?start=0',}r=requests.get("https://movie.douban.com/top250?start=0",headers=head_req)with open("1.html","wb") as html: html.write(r.content)d=pq(filename="1.html")# print d('ol').find('li').html()for data in d('ol').items('li'): print data.find('.hd').find('.title').eq(0).text() print data.find('.star').find('.rating_num').text() print data.find('.quote').find('.inq').text() print
运行下看看结果:
肖申克的救赎9.6希望让人自由。这个杀手不太冷9.4怪蜀黍和小萝莉不得不说的故事。阿甘正传9.4一部美国近现代史。霸王别姬9.4风华绝代。美丽人生9.5最美的谎言。千与千寻9.2最好的宫崎骏,最好的久石让。辛德勒的名单9.4拯救一个人,就是拯救整个世界。海上钢琴师9.2每个人都要走一条自己坚定了的路,就算是粉身碎骨。机器人总动员9.3小瓦力,大人生。盗梦空间9.2诺兰给了我们一场无法盗取的梦。泰坦尼克号9.1失去的才是永恒的。三傻大闹宝莱坞9.1英俊版憨豆,高情商版谢耳朵。放牛班的春天9.2天籁一般的童声,是最接近上帝的存在。忠犬八公的故事9.2永远都不能忘记你所爱的人。龙猫9.1人人心中都有个龙猫,童年就永远不会消失。大话西游之大圣娶亲9.1一生所爱。教父9.2千万不要记恨你的对手,这样会让你失去理智。乱世佳人9.2Tomorrow is another day.天堂电影院9.1那些吻戏,那些青春,都在影院的黑暗里被泪水冲刷得无比清晰。当幸福来敲门8.9平民励志片。搏击俱乐部9.0邪恶与平庸蛰伏于同一个母体,在特定的时间互相对峙。楚门的世界9.0如果再也不能见到你,祝你早安,午安,晚安。触不可及9.1满满温情的高雅喜剧。指环王3:王者无敌9.1史诗的终章。罗马假日8.9爱情哪怕只有一天。
当然这只是第一页的25条,我们已经知道了豆瓣电影top250的url是
https://movie.douban.com/top250?start=0
start参数从0,每次加25,直到
https://movie.douban.com/top250?start=225
所以可以写个循环把它们都抓下来。