爬虫入门二(urllib,urllib2)

来源:互联网 发布:淘宝小二可以介入几次 编辑:程序博客网 时间:2024/06/06 09:10

看了下网上的概念,比较模糊不知道作用。利用例子总结了一下。

1.爬虫

网站有各种数据,获得自己感兴趣的数据并保存的一种脚本。

2.通信基础

1.post和get:(1)get是从服务器上获取数据,post是向服务器传送数据。
(2) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据包装后提交。
(3) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。(对于具体大小各种说法,普遍认为)
(4)get数据会显示在地址栏,密码一类敏感数据应该post方式
一个大神的总结:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
2.request 和response:
(1)response的对象封装了服务器向客户端响应的数据和告诉客户端应该进行什么样的操作
(2)request包含了客户端向服务器端的请求,例如账号密码。

3.利用urllib2

参考:https://www.zhihu.com/question/20899988/answer/97620435
1.获得百度贴吧图片:

#coding=utf-8图片网址:http://tieba.baidu.com/p/2460150866浏览器定位到图片相应位置<img pic_type="0" class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=294db374d462853592e0d229a0ee76f2/e732c895d143ad4b630e8f4683025aafa40f0611.jpg" pic_ext="bmp" height="328" width="560">我们想要获得这个图片的url,书写正则表达式匹配。r'src="(.+?\.jpg)" pic_ext' 括号里面的group1是想要的内容import urllib2import urllibimport redef getHtml(url):    #1.    # request=urllib2.Request(url) 构造了一个request    # responseurllib2.urlopen(request)     使用request向服务器发送请求并获得了response   #2.    page = urllib2.urlopen(url)#直接打来url,和上面一样    response = page.read()    return responsedef saveImg(imageUrl,filename):#保存操作    u=urllib.urlopen(imageUrl)    data=u.read()    f=open(filename,'wb')    f.write(data)    f.close()def getImg(html):    reg = r'src="(.+?\.jpg)" pic_ext'#正则表达式    imgre = re.compile(reg) #pattern    imglist = re.findall(imgre,html)#匹配    x = 0    for imgurl in imglist:        saveImg(imgurl,str(x)+".jpg")        x+=1html = getHtml("http://tieba.baidu.com/p/2460150866")getImg(html)

2.访问空间:cookie的保存以及使用

#coding=utf-8import urllib2import  urllibimport cookielibuser_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = { 'User-Agent' : user_agent }#识别客户端filename='cookie.txt'#创一个cookie实例,保存cookie=cookielib.MozillaCookieJar(filename)#创建cookie处理器并建opener,urlopen其实就是个默认的opener,我们以后就用opener代替了urlopenopener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))postdata=urllib.urlencode({    'uinArea':'1184996095',    'pwdArea':'18221056092',})loginUrl='https://i.qq.com/?rd=1'#创建requestrequest=urllib2.Request(loginUrl,postdata,headers)try:    result=opener.open(request)except urllib2.HTTPError, e:    print e.code    print e.reason#保存cookie,即使被丢弃和已经存在也保存    cookie.save(ignore_discard=True,ignore_expires=True)anotherUrl='https://user.qzone.qq.com/916169754?ptlang=2052&source=friendlist'#从文件里获得cookie = cookielib.MozillaCookieJar(filename)#opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))while(True):    result=opener.open(anotherUrl)#获得的response

3.几个小操作(以后直接用了):

# def saveImg(self,imageUrl,filename):#     u=urllib.urlopen(imageUrl)#     data=u.read()#     f=open(filename,'wb')#     f.write(data)#     f.close()## def saveBrief(self,content,name):#     filename=name+'/'+name+".txt"#     f=open(filename,'w+')#     f.write(content.encode('utf-8'))# import os# def makedir(self,path):#     path=path.strip()#     isExists=os.path.exists(path)#     if not isExists:#         os.makedirs(path)#         return True#     else:#         return False

4.贴吧的评论,页数内容

#根据静谧的博客修改#coding=utf-8import urllibimport urllib2import reclass BDTB:    def __init__(self,baseUrl,seeLZ):        self.baseUrl=baseUrl        self.seeLZ="?see_lz="+str(seeLZ)        self.tool=Tool()    def getpage(self,pagenum):        try:            url=self.baseUrl+self.seeLZ+"&pn="+str(pagenum)            request=urllib2.Request(url)            response=urllib2.urlopen(request)            sPage = response.read()            return sPage.decode('utf-8')        except urllib2.URLError,e:            print 'dsa'            return  None    def getTitle(self):        page = self.getpage(1)        pattern = re.compile('<h3 class="core_title_txt.*?>(.*?)</h3>', re.S)        result = re.search(pattern, page)        if result:            # print result.group(1)            return result.group(1).strip()        else:            return None    def getPageNumber(self):        page = self.getpage(1)        #<li class="l_reply_num" style="margin-left:8px"><span class="red" style="margin-right:3px">141</span>回复贴,共<span class="red">5</span>页</li>        pattern = re.compile('<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>',re.S)        result = re.search(pattern, page)        if result:            # print result.group(1)            return result.group(1).strip()        else:            return None    def getContent(self):        #<div id="post_content_53018668923" class="d_post_content j_d_post_content ">            很多媒体都在每赛季之前给球员排个名,我也有这个癖好…………,我会尽量理性的分析球队地位,个人能力等因素,评出我心目中的下赛季50大现役球员,这个50大是指预估他本赛季在篮球场上对球队的影响力……不是过去的荣誉什么的,所以难免有一定的主观性……如果把你喜欢的球星排低了,欢迎理性讨论!<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=557ae4d4fadcd100cd9cf829428947be/a9d6277f9e2f0708468564d9eb24b899a801f263.jpg" pic_ext="jpeg" pic_type="0" width="339" height="510"><br><br><br><br>状元维金斯镇楼<br>P.S 1 我每天都至少更新一个,不TJ。<br>      2 今年的新秀我就不考虑了,没上赛季参照</div>        page = self.getpage(1)        pattern=re.compile('<div id="post_content_.*?>(.*?)</div>',re.S)#本来我是直接通过正则表达式直接获得内容,但是写起来太麻烦了。看到博主的是面向对象处理,方便的多以后也能用。        result = re.findall(pattern, page)#直接print result是一堆地址        result = self.tool.replace(bdtb.getContent())        for item in result:            print item# 处理页面标签类class Tool:    # 去除img标签,7位长空格    removeImg = re.compile('<img.*?>| {7}|')    # 删除超链接标签    removeAddr = re.compile('<a.*?>|</a>')    # 把换行的标签换为\n    replaceLine = re.compile('<tr>|<div>|</div>|</p>')    # 将表格制表<td>替换为\t    replaceTD = re.compile('<td>')    # 把段落开头换为\n加空两格    replacePara = re.compile('<p.*?>')    # 将换行符或双换行符替换为\n    replaceBR = re.compile('<br><br>|<br>')    # 将其余标签剔除    removeExtraTag = re.compile('<.*?>')    def replace(self, x):        x = re.sub(self.removeImg, "", x)        x = re.sub(self.removeAddr, "", x)        x = re.sub(self.replaceLine, "\n", x)        x = re.sub(self.replaceTD, "\t", x)        x = re.sub(self.replacePara, "\n    ", x)        x = re.sub(self.replaceBR, "\n", x)        x = re.sub(self.removeExtraTag, "", x)        # strip()将前后多余内容删除        return x.strip()baseURL='http://tieba.baidu.com/p/3138733512'bdtb=BDTB(baseURL,1)bdtb.getContent()

5.个人总结:

emmmm..大概流程就是请求获得目标网址所有内容,写正则,匹配获得所需,处理….保存。
cookie的获得和保存。先创建cookie,再创opener,用来获取url,各种操作获得数据保存。

原创粉丝点击