林炳文Evankaka原创作品。

转载请注明出处http://blog.csdn.net/evankaka

摘要:本文将使用Python3.4爬网页、爬图片、自己主动登录。并对HTTP协议做了一个简单的介绍。在进行爬虫之前,先简单来进行一个HTTP协议的解说。这样以下再来进行爬虫就是理解更加清楚。

一、HTTP协议

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。

它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)终于公布了一系列的RFC。RFC 1945定义了HTTP/1.0版本号。当中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本号——HTTP 1.1。

HTTP协议(HyperText Transfer Protocol。超文本传输协议)是用于从WWWserver传输超文本到本地浏览器的传送协议。它能够使浏览器更加高效,使网络传输降低。

它不仅保证计算机正确高速地传输超文本文档。还确定传输文档中的哪一部分。以及哪部分内容首先显示(如文本先于图形)等。

 HTTP的请求响应模型

HTTP协议永远都是client发起请求,server回送响应。见下图:

这样就限制了使用HTTP协议,无法实如今client没有发起请求的时候。server将消息推送给client。

HTTP协议是一个无状态的协议。同一个client的这次请求和上次请求是没有相应关系。

工作流程

一次HTTP操作称为一个事务。其工作过程可分为四步:

1)首先客户机与server须要建立连接。仅仅要单击某个超级链接,HTTP的工作開始。

2)建立连接后。客户机发送一个请求给server。请求方式的格式为:统一资源标识符(URL)、协议版本号号。后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

3)server接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号号、一个成功或错误的代码,后边是MIME信息包括server信息、实体信息和可能的内容。

4)client接收server所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与server断开连接。

假设在以上过程中的某一步出现错误,那么产生错误的信息将返回到client,有显示屏输出。

对于用户来说。这些过程是由HTTP自己完毕的,用户仅仅要用鼠标点击,等待信息显示就能够了

请求报头
请求报头同意client向server端传递请求的附加信息以及client自身的信息。
经常使用的请求报头
Accept
Accept请求报头域用于指定client接受哪些类型的信息。eg:Accept:image/gif。表明client希望接受GIF图象格式的资源。Accept:text/html,表明client希望接受html文本。
Accept-Charset
Accept-Charset请求报头域用于指定client接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.假设在请求消息中没有设置这个域,缺省是不论什么字符集都能够接受。
Accept-Encoding
Accept-Encoding请求报头域相似于Accept,可是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.假设请求消息中没有设置这个域server假定client对各种内容编码都能够接受。

Accept-Language
Accept-Language请求报头域相似于Accept,可是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.假设请求消息中没有设置这个报头域,server假定client对各种语言都能够接受。
Authorization
Authorization请求报头域主要用于证明client有权查看某个资源。当浏览器訪问一个页面时,假设收到server的响应代码为401(未授权),能够发送一个包括Authorization请求报头域的请求,要求server对其进行验证。

Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号。它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入:http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包括Host请求报头域。例如以下:
Host:www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent
我们上网登陆论坛的时候,往往会看到一些欢迎信息。当中列出了你的操作系统的名称和版本号,你所使用的浏览器的名称和版本号,这往往让非常多人感到非常奇妙,实际上,server应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域同意client将它的操作系统、浏览器和其他属性告诉server。只是。这个报头域没必要的。假设我们自己编写一个浏览器。不使用User-Agent请求报头域。那么server端就无法得知我们的信息了。

请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

GET /form.html HTTP/1.1 (CRLF)Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)Accept-Language:zh-cn (CRLF)Accept-Encoding:gzip,deflate (CRLF)If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)Host:www.guet.edu.cn (CRLF)Connection:Keep-Alive (CRLF)(CRLF)

响应报头
响应报头同意server传递不能放在状态行中的附加响应信息。以及关于server的信息和对Request-URI所标识的资源进行下一步訪问的信息。
经常使用的响应报头
Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域经常使用在更换域名的时候。
Server
Server响应报头域包括了server用来处理请求的软件信息。

与User-Agent请求报头域是相相应的。以下是
Server响应报头域的一个样例:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必须被包括在401(未授权的)响应消息中,client收到401响应消息时候,并发送Authorization报头域请求server对其进行验证时,服务端响应报头就包括该报头域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  //能够看出server对请求资源採用的是基本验证机制。

二、Python3.4爬虫编程

1、第一个演示样例,我们要来进行简单的爬虫来爬别人的网页

#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生成 的请求报头。不清楚看以下:

非常easy的一个报头。然后再来看看响应回来的html

这里响应回来的就是我们上面在python的idle中打印出来的网页了!

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

有些网页,比方登录的。假设你不是从浏览器发起的起求,这就不会给你响应,这时我们就须要自己来写报头。然后再发给网页的server,这时它就以为你就是一个正常的浏览器。从而就能够爬了!

#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处理器,它负责从server下载cookie到本地。而且在发送请求时带上本地的cookiecj = 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 = headerreturn 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())

来看看结果:

这时执行返回的

发送出去的请求头

接收回来 的报头

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

非常easy, 我们转码下:

转载于:https://www.cnblogs.com/zfyouxi/p/5284667.html

Python3.x爬虫教程:爬网页、爬图片、自己主动登录相关推荐

  1. Python3.x爬虫教程:爬网页、爬图片、自动登录

    林炳文Evankaka原创作品.转载请注明出处 http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自动登录.并对HTTP协议做了一个简单的介 ...

  2. Python3网络爬虫教程2——urlopen的返回对象

    Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览 Python 全栈工程师核心面试 300 问深入解析(2020 版)----欢迎订阅 上接:Python3网络爬虫 ...

  3. Python3网络爬虫教程8——有道在线翻译项目(JS加密)

    上接: Python3网络爬虫教程7--SSL数字证书 https://blog.csdn.net/u011318077/article/details/86538116 6. js加密(有道在线翻译 ...

  4. python爬虫抓取图片-简单的python爬虫教程:批量爬取图片

    python编程语言,可以说是新型语言,也是这两年来发展比较快的一种语言,而且不管是少儿还是成年人都可以学习这个新型编程语言,今天南京小码王python培训机构变为大家分享了一个python爬虫教程. ...

  5. Python3写爬虫(五)爬取糗事百科段子

    2019独角兽企业重金招聘Python工程师标准>>> 最近几天开始用Python3改写网上用Python2写的案例,发现完全可以用Python3来重构Python2的源码.本篇文章 ...

  6. Python爬虫教程:Python爬取京东商城商品大图详解

    Python爬取京东商城商品大图详解 做为一个爬虫初学者,在做爬取网址图片的练习中以京东网为例爬取商品大图并保存在相应的文件夹 1.导入模块 import urllib.request import ...

  7. 网络爬虫(动态网页爬取关于混合动力汽车的论文数据)

    一.实验目的 (1) 熟悉网页浏览器开发工具的使用: (2) 掌握动态网页加载过程: (3) 掌握 post 请求参数设置: (4) 掌握基本的反反爬技术: (5) 能够根据问题需求,指定网络爬虫方案 ...

  8. Python3爬虫-01-简单网页爬取

    ''' 宇宙黑客王磊磊 Python3爬虫 简单网页的获取第一个简单的示例 爬去Hades 官网首页 '''import sys import urllib.request print(sys.get ...

  9. python爬取淘宝商品做数据挖掘_Python 3爬虫 数据清洗与可视化实战 Python数据抓取技术 python3网络爬虫教程书籍 运用Python工具获取电商平台页面数据挖掘书籍...

    A8 书    名:Python 3爬虫 数据清洗与可视化实战 作 译 者:零一,韩要宾,黄园园 出版时间:2018-03 千 字 数:200 版    次:01-01 页    数:212 开   ...

最新文章

  1. 查看无线网卡工作模式
  2. Leetcode84 柱状图中最大的矩形 详细的解法
  3. Memory and Trident
  4. 什么是僵尸进程与孤儿进程
  5. 协议crc计算_从零了解modbus协议 第三篇
  6. Django的ModelForm
  7. java mongodb怎删改查_Java连接MongoDB进行增删改查
  8. 《赢道——成功创业者的28条戒律》2009年1月出版
  9. 微博html5版登录网址,微博网页版登录入口
  10. RUP软件开发生命周期
  11. linux测试wifi信噪比,无线网络中信噪比(SNR)计算
  12. js 实现继承的几种方式
  13. 短信接口的功能及适用范围
  14. 如何提高kettle在大数据量下的读写速度
  15. 2018年航空概论课后作业(PS:部分答案不正确, 综合得分:83.6)
  16. 设计窗口模拟教室座位表java,基于web的考研自习教室座位管理(完整源码+论文全套+教学视频)...
  17. 猫和老鼠服务器未响应是怎么回事,猫和老鼠手游怎么玩不了?游戏设置及异常解决方法[多图]...
  18. C中出现:错误 C1010 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”等头文件
  19. leetcode 547. 朋友圈 C语言
  20. wifi共享精灵 强大的网络伴侣

热门文章

  1. Activity之间传递参数
  2. 图解 Android 广播机制
  3. HOW TO: Troubleshoot development errors in MOSS 2007
  4. C++学习笔记(14) static_cast 与 dynamic_cast
  5. 我的第一本算法书(图解算法)——什么是堆
  6. python离线录音转文字_python3实现语音转文字(语音识别)和文字转语音(语音合成)...
  7. bankeralgorithm.jar中没有主清单属性_怀旧服:迅击指环和其拉之怒属性一致,为何狂暴战用迅击更好...
  8. 关于Python你必须知道的常识
  9. mysql实际项目中使用多长时间_mysql - 存储过程在实际项目中用的多吗?
  10. mysql can't open file: '..frm'_mysqldump 导出数据时出现can’t opne file ‘xx.frm’ (errno:24)错误...