热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3.4爬虫编程

感谢@林炳文Evankaka转载于http:blog.csdn.netevankaka一、第一个示例,我们要来进行简单的爬虫来爬别人的网页#python3.4爬

感谢@林炳文Evankaka
转载于http://blog.csdn.net/evankaka

一、第一个示例,我们要来进行简单的爬虫来爬别人的网页
    #python3.4 爬虫教程  
    #一个简单的示例爬虫  
    #林炳文Evankaka(博客:http://blog.csdn.net/evankaka/)  
    import urllib.request 
    url = "http://www.douban.com/"  
    webPage=urllib.request.urlopen(url)  
    data = webPage.read() 
    data = data.decode('UTF-8') 
    print(data) 
    print(type(webPage)) 
    print(webPage.geturl())  
    print(webPage.info())  
    print(webPage.getcode())  

这是爬回来的网页输出:
这里写图片描述
这中间到底发生了什么事呢?让我们打开Fiddler来看看吧:
这里写图片描述
左边标红的就表示我们本次访问成功,为http 200

右边上方这是python生成 的请求报头,不清楚看下面:
这里写图片描述
这里响应回来的就是我们上面在python的idle中打印出来的网页了!

二、伪装成浏览器来爬网页

有些网页,比如登录的。如果你不是从浏览器发起的起求,这就不会给你响应,这时我们就需要自己来写报头。然后再发给网页的服务器,这时它就以为你就是一个正常的浏览器。从而就可以爬了!

#python3.4 爬虫教程  
#一个简单的示例爬虫  
#林炳文Evankaka(博客:http://blog.csdn.net/evankaka/)  
import urllib.request  
weburl = "http://www.douban.com/"  
webheader = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}   
req = urllib.request.Request(url=weburl, headers=webheader)    
webPage=urllib.request.urlopen(req)  
data = webPage.read()  
data = data.decode('UTF-8')  
print(data)  
print(type(webPage))  
print(webPage.geturl())  
print(webPage.info())  
print(webPage.getcode())  

来看看请求报头,就是和我们设置的一个样。
这里写图片描述
返回的是一样的:
这里写图片描述
再来一个复杂一点的请求报头:

#python3.4 爬虫教程
#一个简单的示例爬虫
#林炳文Evankaka(博客:http://blog.csdn.net/evankaka/)
import urllib.request
weburl = "http://www.douban.com/"
webheader1 = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
webheader2 = {
    'Connection': 'Keep-Alive',
    'Accept': 'text/html, application/xhtml+xml, */*',
    'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
    #'Accept-Encoding': 'gzip, deflate',
    'Host': 'www.douban.com',
    'DNT': '1'
    }
req = urllib.request.Request(url=weburl, headers=webheader2)  
webPage=urllib.request.urlopen(req)
data = webPage.read()
data = data.decode('UTF-8')
print(data)
print(type(webPage))
print(webPage.geturl())
print(webPage.info())
print(webPage.getcode())

看看生成 的结果:
这里写图片描述
返回还是:
这里写图片描述

3、爬取网站上的图片

前面我们可以爬网页了,下一步我们就可以批量的自动下载该网页上的各种数据了~,比如,这里我要下载该网页上的所有图片

#python3.4 爬虫教程
#爬取网站上的图片
#林炳文Evankaka(博客:http://blog.csdn.net/evankaka/)
import urllib.request  
import socket  
import re  
import sys  
import os  
targetDir = r"D:\PythonWorkPlace\load"  #文件保存路径
def destFile(path):  
    if not os.path.isdir(targetDir):  
        os.mkdir(targetDir)  
    pos = path.rindex('/')  
    t = os.path.join(targetDir, path[pos+1:])  
    return t  
if __name__ == "__main__":  #程序运行入口
    weburl = "http://www.douban.com/"
    webheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} 
    req = urllib.request.Request(url=weburl, headers=webheaders)  #构造请求报头
    webpage = urllib.request.urlopen(req)  #发送请求报头
    cOntentBytes= webpage.read()  
    for link, t in set(re.findall(r'(http:[^\s]*?(jpg|png|gif))', str(contentBytes))):  #正则表达式查找所有的图片
        print(link)
        try: 
            urllib.request.urlretrieve(link, destFile(link)) #下载图片
        except:
            print('失败') #异常抛出

这是正在运行的过程:
这里写图片描述
打开电脑上对应的文件夹,然后来看看图片,这里只是一部分哦
这里写图片描述
真实的网页上的图片
这里写图片描述

4、保存爬取回来的报文

    def saveFile(data):  
        save_path = 'D:\\temp.out'  
        f_obj = open(save_path, 'wb') # wb 表示打开方式 
        f_obj.write(data)  
        f_obj.close()  

    # 这里省略爬虫代码 
    # ... 

    # 爬到的数据放到 dat 变量里 
    # 将 dat 变量保存到 D 盘下 
    saveFile(dat)  

比如:

    #python3.4 爬虫教程 
    #一个简单的示例爬虫 
    #林炳文Evankaka(博客:http://blog.csdn.net/evankaka/) 
    import urllib.request  
    def saveFile(data):  
        save_path = 'D:\\temp.out'  
        f_obj = open(save_path, 'wb') # wb 表示打开方式 
        f_obj.write(data)  
        f_obj.close()  
    weburl = "http://www.douban.com/"  
    webheader1 = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  
    webheader2 = {  
        'Connection': 'Keep-Alive',  
        'Accept': 'text/html, application/xhtml+xml, */*',  
        'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',  
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',  
        #'Accept-Encoding': 'gzip, deflate', 
        'Host': 'www.douban.com',  
        'DNT': '1'  
        }  
    req = urllib.request.Request(url=weburl, headers=webheader2)    
    webPage=urllib.request.urlopen(req)  
    data = webPage.read()  
    saveFile(data)# 将data变量保存到 D 盘下 
    data = data.decode('UTF-8')  
    print(data)  
    print(type(webPage))  
    print(webPage.geturl())  
    print(webPage.info())  
    print(webPage.getcode())  

然后看看D盘:

这里写图片描述
用NotePad打开:
这里写图片描述

三、Python3.x 自动登录

这里写图片描述
普通情况下我们输入邮箱和密码后,登录。来看看。这就是提交表单的内容
这里写图片描述
python3.4代码编写:

import gzip
import re
import http.COOKIEjar
import urllib.request
import urllib.parse
#解压函数
def ungzip(data):
    try:        # 尝试解压
        print('正在解压.....')
        data = gzip.decompress(data)
        print('解压完毕!')
    except:
        print('未经压缩, 无需解压')
    return data
#获取_xsrf 
def getXSRF(data):
    cer = re.compile('name=\"_xsrf\" value=\"(.*)\"', flags = 0)
    strlist = cer.findall(data)
    return strlist[0]
#构造文件头
def getOpener(head):
    #设置一个COOKIE处理器,它负责从服务器下载COOKIE到本地,并且在发送请求时带上本地的COOKIE
    cj = http.COOKIEjar.COOKIEJar()
    pro = urllib.request.HTTPCOOKIEProcessor(cj)
    opener = urllib.request.build_opener(pro)
    header = []
    for key, value in head.items():
        elem = (key, value)
        header.append(elem)
    opener.addheaders = header
    return opener
#构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。 
header = {
    'Connection': 'Keep-Alive',
    'Accept': 'text/html, application/xhtml+xml, */*',
    'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Accept-Encoding': 'gzip, deflate',
    'Host': 'www.zhihu.com',
    'DNT': '1'
}

url = 'http://www.zhihu.com/'
opener = getOpener(header)
op = opener.open(url)
data = op.read()
data = ungzip(data)     # 解压
_xsrf = getXSRF(data.decode())
#post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据)
url += 'login/email'
id = '这里写自己的邮箱'
password = '这里写自己的密码'
#构造Post数据,他也是从抓大的包里分析得出的。
postDict = {
        '_xsrf':_xsrf, #特有数据,不同网站可能不同 
        'email': id,
        'password': password,
        'rememberme': 'y'
}
#需要给Post数据编码 
postData = urllib.parse.urlencode(postDict).encode()
op = opener.open(url, postData)
data = op.read()
data = ungzip(data)

print(data.decode())

来看看结果:

这时运行返回的

这里写图片描述
发送出去的请求头
这里写图片描述
返回的数据是什么意思呢:
很简单, 我们转码下:
这里写图片描述


推荐阅读
author-avatar
达人多多宝_836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有