小白学python爬虫
一.前期调研
1.网页有静态网页和动态网页之分:
爬取静态网页,只要仔细去分析网页结构,爬取我们所需内容,基本没什么问题。
爬取动态网页,有的可能涉及到JS,目前的项目还遇到过。JavaScript最常用于图片操作、表单验证以及内容动态更新。
2.常见爬虫框架:
(1).“scapy爬虫框架”,辅助Xpath等。
大概了解下就行,个人还是不太习惯这种框架,所以不推荐,如果想了解,参考网址(不看也罢):
http://www.icodelogic.com/?p=441
http://www.icodelogic.com/?p=459
http://blog.csdn.net/pleasecallmewhy/article/details/19354723
http://blog.csdn.net/pleasecallmewhy/article/details/19642329
(2).“urllib或者request爬虫框架”,辅助beautiful,正则表达式等。
个人比较习惯用“urllib+beautiful+正则表达式”的写法。所以后面主要介绍下这种方法的流程。
二.学习准备
本人一开始也是小白一个,python和爬虫都不熟悉。为了项目需要,一步步学习准备,最后成功爬取特定网站中自己所需的内容。
所需知识:
1.强力推荐去看看这个网站,可以了解爬取网页的一般过程,这个网站的链接比较大,可能看着容易头晕,不过多花点时间学习下,还是会有收获的。剩下的2,3,4都可以再爬取过程中去学习就行。
http://www.crifan.com/summary_about_flow_process_of_fetch_webpage_simulate_login_website_and_some_notice/
2.python基本语法。
3.正则表达式。我分析网页内容用的最多的方法。这部分可以参考我的另外一篇博客,关于正则表达式使用过程中的一些笔记。
4.BeautifulSoup。这部分我目前为止也没有用到多少,不过要是掌握倒是可以比正则表达式可以省心多了。如果想学习,参考网站(不看也罢):
http://www.crifan.com/python_third_party_lib_html_parser_beautifulsoup/
http://blog.chinaunix.net/uid-26722078-id-3519422.html
http://blog.csdn.net/watsy/article/details/14161201
这里简单说下关于BeautifulSoup:
(1)Beautiful Soup相比其他的html解析有个非常重要的优势:html会被拆解为对象处理,全篇转化为字典和数组。相比于使用正则表达式和xpath去解析内容的爬虫,省略了学习正则表达式的高成本。
(2)不同的编码格式对urlib获取网页结果是有影响的:百度是gbk格式,其他的一般网站比如google就是utf-8,此时可以用下列语句实现:
htmlCharset="gbk"
soup=BeautifulSoup(html,fromEncoding=htmlCharset)
(3)my=soup.findAll('link',attrs={'rel':"dns-prefetch",'href':"//ns0.bdstatic.com"})
注意加引号和冒号
三.编写爬虫
1.流程:
(1)辅助IE9或chrome的开发工具分析如何模拟登陆(参考上面强力推荐的那个网站,有一部分是教怎么去分析的)
(2)编写代码模拟登陆网站(这一部分是比较关键和比较困难的,主要是对网络协议不是很熟悉,得结合上面的工具分析)
(3)利用urllib等工具获取网页内容
(4)分析网页结构,利用正则表达式提取所需内容;或者分析内容提取下一层的url链接,进一步获取所需的内容。(这一部分个人花费时间最长)
2.代码示例。以爬取coursera视频为例子。 第一步,登陆网站:这一步按照之前参考网站的登陆百度首页的例子去做吧。注意有时候POST一直失败跟header的cookie有关。
第二步:urllib非常好用的一个库,获取url响应内容的。
第三步:根据获得的响应,找到我们需要的资源下载链接,然后下载。
一些注意问题:
(1)很多时候我们需要处理中文字符,为了避免解码出错或者字体显示出错:“UnicodeEncodeError: 'ascii' codec can'tencodecharacters in position 0-3”,需要在文件前加上:
reload(sys)
sys.setdefaultencoding("utf-8" )
但是加上reload(sys)这句话之后,有时Python IDLE无法正常执行命令和print,所以需要加上下面的完整语句:
(2)print >>f,soup 直接将soupprint到文件f,并且末尾自动换行
(3)在保存中文名字的文件时,需要对名字做下decode转换
video_name=video_name.decode('utf-8')
#下载视频
if video_id<3:
f1=open(video_name,'wb')
print>>f1,"hello"
#video=get_content(video_url);
#f.write(video);
f1.close()
#print>>f_log,"download ",video_name,"OK. ---",video_url
video_id=video_id+1;