python爬取数据的类型_Python爬⾍总结(⼆)常见数据类型
及其解析⽅法
Python爬⾍总结(⼆)常见数据类型
上⼀篇我们简单介绍了如何⽤Python发送 http/https 请求获取⽹上数据,从web上采集回来的数据的数据类型有很多种,主要有:
放在HTML⾥.
直接放在javascript⾥.
放在JSON⾥.
放在XML⾥.
注意:这⾥很多概念都是web前端开发⾥的,因为我们采集的⼤多数数据都来⾃web,因此了解⼀些前端知识还是挺有必要的.
下⾯我简单介绍下各种数据类型,并结合⼀些实例介绍它们的解析⽅法.
数据类型
放在HTML⾥
HTML即超⽂本标记语⾔,⽬前⼤多数⽹页都是HTML写的,⾃然很多数据被存放在HTML中.
直接放在javascript⾥
javascript 作为最主要的前端开发脚本被⼴泛使⽤,很多关键数据被直接放到javascript 脚本⾥.
power的用法及短语放在JSON⾥
json即JavaScript 对象表⽰法.它其实是独⽴于语⾔的,常常在javascript存储或异步传输(后⾯我们会详细讨论这个)的时候被⽤到.因为javascript 在web前端开发中的⼤量运⽤,json也成了web主要数据类型之⼀.
放在XMl⾥
XML指可扩展标记语⾔,被设计⽤来传输和存储数据。很多javascript 程序员喜欢⽤xml传输数据,⽽且有的⽹页是直接⽤XML编写的(⽽不是HTML).
实例
实例1-⾖瓣电影"正在热映"信息采集
图1
在浏览器上右击->查看源代码(view page source):
图2
上⼀篇⽂章的爬⾍程序爬取的⾖瓣电影的页⾯就是图2这些HTML标签.
现在假如我们要采集"正在热播"的电影的电影名称,上映年份和电影评分信息.⾸先就要定位这些信息.定位的⽅法主要有:正则表达式法,xpath 定位法和Beautifulsoup定位法.
正则表达式法:
.对正则表达式不太了解的同学可以查看这⾥:正则表达式.该定位⽅法是最万能的⽅法,不仅可以定位⾖瓣电影这种"中规中矩"的把信息放到HTML内的数据,⽽且对其它⼀些:放在javascript⾥的,放在json⾥的,放在xml⾥的,注释信息等等也都可以处理.但缺点是写⼀个能正确的正则表达式较为困难,⼀般需要反复调试.
下⾯是我⽤正则表达式定位电影名称,上映年份,电影评分信息(图3是运⾏结果).
importurllib2,re
url="movie.douban/"page=urllib2.urlopen(url).read()
result= re.findall('
图3:运⾏结果
XPath定位法:
XPath 是⼀门在 XML ⽂档中查信息的语⾔,但其实它也可以⽤来查HTML信息.它可以借助XPth强⼤的语法很⽅便的定位元素,⽽且现
在很多浏览器都有插件让你很容易的就得到元素的XPath路径,如firefox的firebug插件.
下⾯是⽤XPath定位的代码:
importurllib2,refrom lxml importetreebackground背景铺满
url="movie.douban/"page=urllib2.urlopen(url).read()
python请求并解析json数据
temp=etree.HTML(page)
results= temp.xpath("//li[@class='ui-slide-item']")for item inresults:print 'Movie:',('data-title'),'Date:',('data-学习c语言的网站
release'),'Score:',('data-rate')
BeautifulSoup定位法:
下⾯是⽤BeautifulSoup定位的代码:
importurllib2,refrom bs4 importBeautifulSoup
url="movie.douban/"page=urllib2.urlopen(url).read()
soup= BeautifulSoup(page,"html.parser")
results= soup.find_all("li",class_='ui-slide-item')for item inresults:print 'Movie:',('data-title'),'Date:',('data-
release'),'Score:',('data-rate')
XPath⽅法和BeautifulSoup⽅法定位元素相当⽅便,但是它们不能定位直接放在在javascript中的数据,注释数据等不在XML HTML内的信
息.实际解析定位过程中往往采取上⾯⼏种⽅法结合的⽅式.如:先⽤正则表达式从js代码中匹配出html数据,然后再⽤XPath或BeautifulSoup
解析处理.
注意:BeautifulSoup输出是unicode编码,如果你希望结果是utf-8编码,记得转码.
实例2-采集⼈民⽇报最近所发⽂章的标题
链接:
如图3 ,它下⾯所列的⽂章信息并不在HTML标签⾥,⽽是以Json数据类型放在js 代码⾥了.
图4
这种情况也⾮常常见.解决思路是先⽤正则表达式把json数据取出来,然后在⽤python 的json库解析json数据.下⾯是代码:
importurllib2,json,re
url="mp.weixin.qq/profile?
src=3×tamp=1469945371&ver=1&signature=bSSQMK1LY77M4O22qTi37cbhjhwNV7C9V4aor9HLhAsvBDAQSoh7EBJeIvj eOFX2Fq4BSZtCO0Syg=="page=urllib2.urlopen(url).read()
result= re.findall("var msgList = '(\{\S+\})';",page)
temp= re.sub(""", '"',result[0])
if函数多个条件是什么意思json_data= json.loads(temp,encoding='utf-8')for item in json_data['list']:print item['app_msg_ext_info']['title']
运⾏结果:
图4
其它说明
存在XML中的数据类型的处理⽅法和存在HTML中的处理⽅法相同,可以参考实例1的操作步骤这⾥就不在赘述.
下⾯主要提醒⼤家⼀定要注意解析过程中的编码问题.
编码问题
在解析的过程中要注意编码问题,因为⽹页有UTF-8 编码的,也有GBK编码的,还有GB2312等等. 如果编码问题没有处理好,很有可能会导致输⼊输出异常,正则表达式匹配错误等问题.我的解决办法是坚持⼀个中⼼思想: "不管你是什么编码来的,到解析程序统⼀换成utf-8编码".⽐如有的⽹页是GBK编码,在处理之前我会先对它进⾏⼀个转码操作:
utf8_page = GBK_page.decode("GBK").encode("utf8")
同时在代码的初始化位置(或者是最开始部分)我⼀般会加上以下代码:
importsys
reload(sys)
sys.setdefaultencoding('utf8')
同时代码⽂件的编码⽅式也要保证是utf-8.
这样处理调理⽐较清晰,统⼀.不会出现⼀个utf-8的正则表达式和⼀个GBK的字符串做匹配最后啥也匹配不出来.或者输出的数据即有utf8编码的字符串,⼜有GBK编码的字符串导致IO错误.
importchardetimporturllib2#可根据需要,选择不同的数据
TestData = urllib2.urlopen('www.baidu/').read()printchardet.detect(TestData)
运⾏结果是:
准确的判断出百度的编码⽅式是utf-8.
总结
面试数据库问题今天介绍了常见的数据类型,并结合实例介绍了:正则表达式法,XPath定位法,BeautifulSoup定位法三种定位⽅法.最后还介绍了爬⾍初学者经常头疼的编码问题,介绍了Chardet ⼯具.下⼀篇我准备介绍⼀下AJAX异步加载的处理办法和常见的反爬⾍策略及其应对⽅法.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论