Python爬虫简单笔记

Python2.7里内置了很多非常有用的库,它在我电脑上的位置在/usr/lib/python2.7中。

写个基本的爬虫要用到的库有urllib、urllib2、cookielib、sgmllib和re,下面先分别简单介绍下一些文件的信息和相关函数——具体的真的是建议阅读源码,网上找的资料反而不及它直观(但先了解个大概总是好的),但sgmllib除外。先看一段代码吧。

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

urllib2.install_opener(opener)

response = urllib2.urlopen(url)

urllib2.py 这个文件的注释是最最良心的,基本上看了下注释和浏览文件主class和def都能了解用法了。按注释上的说法,它是An extensible library for opening URLs using a variety of protocols. 其主要class有:

Handler —— Each Handler implements a particular protocol or option. 它并不是一个特定的class,而是一堆有各自专门作用的Handler的集合,比如在def build_opener里default_classes记录的ProxyHandler, HTTPHandler(各为一种class)。每一个Handler都是用特定的url协议打开url或处理url的一些相关内容,比如上面的HTTPCookieProcessor,能通过传入的CookieJar沿用之前的Cookie,并有http_request和http_response函数将其整入到request或response当中。这些class都继承于class BaseHandler。

class OpenerDirector —— The OpenerDirector sets up the User Agent as the python-urllib client and manages a collection of Handler objects.

在其__init__函数可以清楚的看到self.addheaders = [(‘User-agent‘, client_version)] 一句,可见它现在是准备构造一个请求(只是准备)。然后它还有add_handler(self, handler)方法来为其添加Handler。简单来说就是个人认为它是用来告诉urllib2(上面说了as the python-urllib client)该以怎样的方式处理作参传入的url。至于这个class下面的open这些方法稍后再说。

def build_opener(*handlers) 实例化一个OpenerDirector类, 并将它稍加处理后return

def install_opener 函数用于将传入的OpenerDirector对象用global转换成全局变量,这样urllib2打开url时就能用设定好的方式打开

def urlopen 先看它相关的源码:

(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):

global _opener

if _opener is None:

_opener = build_opener()

return _opener.open(url, data, timeout)

然后对于返回的页面结果的相关描述是,It opens the URL and returns the results as file-like object. url和请求可能用到的data都在参数列表里面了,还有最后一句代码,可见这里是真正的发送请求和返回页面信息的地方。在这顺便说下 OpenerDirector的open() 中有req = Request(fullurl, data) 一句,可见Request是在这构建的。然后,open()又调用了_open(),_open()又调用了_call_chain()......这些函数还会一层一层的调用下去,这里就不扯了。我们写爬虫要考虑的到 urlopen()这里就够了。等以后看较低层的内容时我再另外写文说明吧。

还有其他的一些就不说了,感觉没必要,如class Request,就是An object that encapsulates the state of a request.

Urllib.py 对于特定url请求的都还是直接用urllib2.py就好了,它有部分内容都是urllib.py 给import过去的,感觉那边的使用方便多了;虽说这里有不少内容都是urllib2.py上没用的,但总感觉可以用别的更易懂的方式替代掉。另外,这个文件总有些莫名其妙的东西(比如突然蹦出一行 ftpcache = {} 老搞得我开始怀疑人生

所以这里只说该文件的一个character set处理的问题。比如它有urlencode(),可将str进行URL编码()——当然是先编码再将data作参整合到Request当中啦。此外,也还有toByte()这样的处理方式。这些都是散的,要用的时候看源码查谷歌就好。

此外,它还有if sys.platform == ‘darwin‘和elif os.name == ‘nt‘这样好玩的语句。这个文件,可以说想了解基层的处理的话,一定要读。

Cookielib.py 我对cookie不怎么了解,这里也只挑一点点个人觉得较重要的讲

class Cookie 就只是对一个cookie操作啊,也是__init__ __str__ __repr__这些操作,

也还有直接对它的特定属性进行操作的,比如

set_nonstandard_attr(self, name, value):

self._rest[name] = value

class CookieJar 注释说得很清楚了,Collection of HTTP cookies。至于Cookie的收集来源就是path(好像也有方法支持从request里剥下来?不十分确定)。主要方法有_cookies_for_domain和_cookies_for_request。

在这顺便提下Cookie的 domain和path属性。domain为cookie对象的有效域,可以不是请求生成的访问域。cookie不能直接跨域访问,但能有一定的方法突破这个限制。

path则表示cookie所在目录

另外,有些页面貌似是要附有特定进入页面的cookie信息才有效的样子(至少我是这么理解针对我学校课程信息的爬虫代码的).

sgmllib.py 读这个文件的时候感到十分蛋疼,完全不知道讲的啥。在这种情况下,个人建议还是先上网查查这个文件干嘛的,大概怎么用,理清点结构再回来看,这时就会感到清晰多了。

这文件主要就是一个SGMLParser。它将HTML文档内容根据标签等分解成一个个有用的片段,并根据各片段的特点分别调用自身内对象的方法进行处理,解读各片段时会依照原文档里出现的顺序

在定义解析Hypertext时具体要干嘛时,要先建立一个SGMLParser子类,然后定义在遇到特定标签的行为(如def start_td就是描述遇到<td>的时候这个子类要干嘛,def end_td则是解析到</td>时的行为),至于在两者中间呢...between tags is passed to the parser by calling self.handle_data().另外,它也还能解析自定义标签。据说解析大份文档时,性能上是优于正则的。这个我没测试。

re.py则是python里用来表示正则的。常用的就是reg = re.complie(‘xxx‘) 来构建一个正则式,再objs = reg.findall(content) 在content里找到全部的符合reg的内容。然后就可以for obj in objs来遍历处理了。

另外,如果有必要设utf-8编码,最好记得import sys后,再reload(sys) ,然后再设sys.setdefaultencoding( "utf-8" )

然后直接上个最简单的实例吧

url = "http://xxxxxx"

cookiejar = cookielib.CookieJar() # 下面有检查的,没有cookie它也会自己间一个

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

urllib2.install_opener(opener)

response = urllib2.urlopen(url)

content = response.read()

content = content.decode("gb18030")

print content

爬下来了就用sgml或者re找你感兴趣的部分吧。可惜我正则并不算过关,写个麻烦点的都得先看看例子。

时间: 2024-11-01 19:46:40

Python爬虫简单笔记的相关文章

python 爬虫学习笔记1

经过一段时间的学习,终于入了门 先爬一个csdn 的blog练练手 整体思路是首先判断某个blog有多少页 然后根据页数 去获得相应的url 再爬出每一页的title和对应的url 这里使用了BeautifulSoup来解析页面 #coding=utf-8 import urllib2 from bs4 import BeautifulSoup import sys reload(sys) sys.setdefaultencoding('utf-8') def query_item(input,

Python BeautifulSoup 简单笔记

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

Python爬虫简单入门及小技巧

刚刚申请博客,内心激动万分.于是为了扩充一下分类,随便一个随笔,也为了怕忘记新学的东西由于博主十分怠惰,所以本文并不包含安装python(以及各种模块)和python语法. 目标 前几天上B站时看到一部很好玩的番剧,名字<笨女孩>,实际上是由同名的搞笑向漫画动画化的.大家都知道动画一般一周一更,很难满足我们的需求,所以我们就来编写一个爬虫,来爬取漫画咯. 那么本文的目标就是爬取<初音MIX>这部漫画(因为笨女孩我已经爬取过了>_<).这部漫画我记得是小学的时候看的,也是

python爬虫(简单版)

学过python的帅哥都知道,爬虫是python的非常好玩的东西,而且python自带urllib.urllib2.requests等的库,为爬虫的开发提供大大的方便. 这次我要用urllib2,爬一堆风景图片. 先上重点代码 1 response = urllib2.urlopen(url).read() 2 soup = BeautifulSoup( 3 response, # html字符串 4 'html.parser', # html解析器 5 from_encoding='utf-8

[python爬虫]简单爬虫功能

在我们日常上网浏览网页的时候,经常会看到某个网站中一些好看的图片,它们可能存在在很多页面当中,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的时候并没有另存为选项,还有办法就通过就是通过截图工具截取下来,但这样就降低图片的清晰度.就算可以弄下来,但是我们需要几千个页面当中的图片,如果一个一个下载,你的手将残.好吧-!其实你很厉害的,右键查看页面源代码. 我们可以通过python 来实现这样一个简单的爬

Python爬虫学习笔记1

加入实验室,要写爬虫,以前写过java的,新学python练练手 首先是发包程序,框架如下: 首先是POST方式,代码如下: 1 import urllib 2 import urllib2 3 url='http://someserver.com/cgi-bin/register.cgi' 4 user_agent='Mozilla/4.0' 5 values={ 6 'name':'Liuyuqing', 7 'location':'DUT', 8 'language':'python' 9

Python爬虫--简单爬取图片

今天晚上弄了一个简单的爬虫,可以爬取网页的图片,现在现在做一下准备工作. 需要的库:urllib 和 re urllib库可以理解为是一个url下载器,其中的有两个重要的方法 urllib.urlopen()和urllib.read()这两个方法,具体使用可以在网上查到;re这个库提供对正则表达式支持. 我们要爬取的网页是:http://pic.yesky.com/496/33546996d_13.shtml   把美女筱崎爱给拔下来,其实关键就是要写出一个图片地址对应的正则表达式,下面是代码片

Python爬虫学习笔记(一)

1.urllib2简介 urllib2的是爬取URL(统一资源定位器)的Python模块.它提供了一个非常简单的接口,使用urlopen函数.它能够使用多种不同的协议来爬取URL.它还提供了一个稍微复杂的接口,用于处理常见的情况 - 如基本身份验证,cookies,代理等. 2.抓取URLs 使用urlib2的简单方式可以像下面一样: import urllib2 response = urllib2.urlopen('http://python.org/') html = response.r

【Python爬虫学习笔记(1)】urllib2库相关知识点总结

1. urllib2的opener和handler概念 1.1 Openers: 当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例).正常情况下,我们使用默认opener:通过urlopen.但你能够创建个性的openers.可以用build_opener来创建opener对象.一般可用于需要处理cookie或者不想进行redirection的应用场景(You will want to create openers if you want to f