您的位置:首页 > 编程语言 > Python开发

Python3.4爬虫编程

2016-02-03 18:31 926 查看
感谢@林炳文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_p
bc1c
ath, '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())


来看看结果:

这时运行返回的



发送出去的请求头



返回的数据是什么意思呢:

很简单, 我们转码下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python url 爬虫 编程