小白学python爬虫

来源:互联网 发布:plsql导入数据和表结构 编辑:程序博客网 时间:2024/06/07 13:02

一.前期调研

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

   1Beautiful 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;


0 0
原创粉丝点击