感谢@林炳文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())
来看看请求报头,就是和我们设置的一个样。
返回的是一样的:
再来一个复杂一点的请求报头:
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',
'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、爬取网站上的图片
前面我们可以爬网页了,下一步我们就可以批量的自动下载该网页上的各种数据了~,比如,这里我要下载该网页上的所有图片
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')
f_obj.write(data)
f_obj.close()
saveFile(dat)
比如:
import urllib.request
def saveFile(data):
save_path = 'D:\\temp.out'
f_obj = open(save_path, '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',
'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 = 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
def getXSRF(data):
cer = re.compile('name=\"_xsrf\" value=\"(.*)\"', flags = 0)
strlist = cer.findall(data)
return strlist[0]
def getOpener(head):
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 = {
'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())
url += 'login/email'
id = '这里写自己的邮箱'
password = '这里写自己的密码'
postDict = {
'_xsrf':_xsrf,
'email': id,
'password': password,
'rememberme': 'y'
}
postData = urllib.parse.urlencode(postDict).encode()
op = opener.open(url, postData)
data = op.read()
data = ungzip(data)
print(data.decode())
来看看结果:
这时运行返回的
发送出去的请求头
返回的数据是什么意思呢:
很简单, 我们转码下: