放弃编译了,Spark连最基本的hive都不支持就当成hive被抛弃了吧。垃圾hadoop。
虽然如此,但还是很头疼,这样一来只能把最基本的CVS文件当成数据库来使用,这样虽然也挺方便,但总归只是成为折中之举,或许在以后会有更好的解决方案,现在姑且如此。
所以今天还是来写写所学内容。
今天算是仔细学习了爬虫技术(多线程、分布式、爬虫框架这些方面暂时放一放),包括python的requests库、Beautiful Soup库、PhantomJS库、Selenium库以及一个相当方便的爬取、对元素和属性进行遍历的语言XPath。
算上之前学习过的Urllib库,网页访问的库算是比较熟练了,相比于繁琐的Urllib3,requests可以说简洁优美而且相当适应于脚本,所以算是一个高级的库,不过如果想要追求最高的速率可能还是会去用Urllib3,因为requests还是调用了Urllib3。
requests封装了http所有的基本请求方式。
r = requests.post("http://httpbin.org/post") r = requests.put("http://httpbin.org/put") r = requests.delete("http://httpbin.org/delete") r = requests.head("http://httpbin.org/get") r = requests.options("http://httpbin.org/get")
对于这些请求方式也有额外的参数来使用,就像传递post的数据:
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("http://httpbin.org/post", data=payload) print r.text
上传文件:
import requests url = 'http://httpbin.org/post' files = {'file': open('test.txt', 'rb')} r = requests.post(url, files=files) print r.text
获取/发送cookies:
import requests url = 'http://example.com' r = requests.get(url) print r.cookies print r.cookies['example_cookie_name'] url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) print r.text
这些就是常见用法,另外还有保持session的操作比较实用。
还有几个相当有用的库就是PhantomJS库、Selenium库,这两个库一起使用就可以完全自动化模拟用户行为,如果网页过于复杂提取不了API就可以尝试这种组合,PhantomJS能提供一个完整的页面渲染,使js中的数据操作也能够得到,Selenium能模拟用户操作,组合使用就可以完成高效的自动化用户行为。但代价是很慢,如果还是大批量的获取信息还是找数据比较踏实。
XPath简直是爬虫的利器,简单明了而且功能也很丰富,对于我来说正则表达式和selector都相当苦手,但这个可以说很方便了。
不过如果要全部写一遍就太麻烦了,记录几个相当有用的实例。
选取 price 节点中的所有文本 /bookstore/book/price/text() 选取价格高于 35 的所有 price 节点 /bookstore/book[price>35]/price 选取 price 节点的所有后代元素(子、孙等)以及当前节点本身 /bookstore/book/price/descendant-or-self 选取所有后代元素(子、孙等)以及当前节点本身后显示文本 /bookstore/book/price/descendant-or-self::text()
text()函数只是XPath的一个函数,其余功能可以参考W3。
另外记录一个有用的python函数translate() 和 其配合函数 maketrans() ,这个函数可以进行爬取后的数据的简单清洗,去除空格、替换字符什么的。
translate() 方法语法:
Python3中:
1
|
S.translate(table) |
Python2中:
1
|
S.translate(table[,delchars]) |
具体使用时maktrans()可以生产参数所需的table。
intab = "aeiou" outtab = "12345" deltab = "thw" trantab1 = str.maketrans(intab,outtab) # 创建字符映射转换表 trantab2 = str.maketrans(intab,outtab,deltab) #创建字符映射转换表,并删除指定字符 test = "this is string example....wow!!!" print(test.translate(trantab1)) print(test.translate(trantab2))
输出结果为
th3s
3s
str3ng
2x1mpl2
....w4w!!!
3s
3s
sr3ng
2x1mpl2
....
4
!!!