黑马python2.7的爬虫1- 爬虫原理与数据抓取

1、使用的IDE和编辑器

IDE:PyCharm 、 Visual Studio

编辑器:Vim 、Sublime Text等

抓包工具:fiddler 

python需要导入各种各样强大的库

教程基于python2.7版本的

2、Python爬虫,我们需要学习的有

1. Python基础语法学习(基础知识)
2. HTML页面的内容抓取(数据抓取)
3. HTML页面的数据提取(数据清洗)
4. Scrapy框架以及scrapy-redis分布式策略(第三方框架)
6. 爬虫(Spider)、反爬虫(Anti-Spider)、反反爬虫(Anti-Anti-Spider)之间的斗争....

我们今后要学习的,是聚焦爬虫

3、HTTP工作原理

网络爬虫抓取过程可以理解为模拟浏览器操作的过程

浏览器的主要功能是向服务器发出请求,在浏览器窗口中展示您选择的网络资源,HTTP是一套计算机通过网络进行通信的规则。请求和响应

4、Cookie 和 Session

服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。

为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。

Cookie:通过在 客户端 记录的信息确定用户的身份。

Session:通过在 服务器端 记录的信息确定用户的身份。

5、urllib2库的基本使用

urlopen:打开网页,获取页面

urllib2.Request:能增加很多参数

也可以通过调用Request.add_header() 添加/修改一个特定的header,用来随机增加代理user agent

常用的User-Agent列表

6、get and urllib.urlencode()

urllib 和 urllib2 都是接受URL请求的相关模块,但是提供了不同的功能:
  • urllib 仅可以接受URL,不能创建 设置了headers 的Request 类实例;

  • 但是 urllib 提供 urlencode 方法用来GET查询字符串的产生,而 urllib2 则没有。(这是 urllib 和 urllib2 经常一起使用的主要原因)

  • 编码工作使用urllib的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。(注意,不是urllib2.urlencode() )

所以,结合起来用,取长补短

通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。Request加参数,这个方法给是url加参数

get方式贴吧实战  

注意:

request = urllib2.Request(url, headers = headers) #2headers

python with open as f写中文乱码   谁编码有问题就对谁编码

Python open() 函数

  with open(unicode(filename), 'w') as f:  #filename=哈哈.index
        print filename
        f.write(html)
    print '-' * 35

main函数》爬取函数》页面保存

7、POST方式

Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。

json.dumps()和json.loads()

python字符串前面加u,r,b的含义


总结:post参数在urllib2.Request(url,data = data, headers = headers)里面,get参数在url里面


CA的作用是检查证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改,以及对证书和密钥进行管理。我的理解是类似网络的权威中介吧!

8、Handler处理器 和 自定义Opener

基本的urlopen()方法不支持代理、cookie等其他的HTTP/HTTPS高级功能。所以要支持这些功能:

  1. 使用相关的 Handler处理器 来创建特定功能的处理器对象;
  2. 然后通过 urllib2.build_opener()方法使用这些处理器对象,创建自定义opener对象;
  3. 使用自定义的opener对象,调用open()方法发送请求。

1、自定义opener()

# 调用自定义opener对象的open()方法,发送request请求
response = opener.open(request)
这种方式发送请求得到的结果,和使用 urllib2.urlopen() 发送HTTP/HTTPS请求得到的结果是一样的。如果在 HTTPHandler()增加 debuglevel=1参数,还会将 Debug Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。

就是能看到请求数据,不用抓包,哈啊哈,强

2、ProxyHandler处理器(代理设置)

免费代理ip寿命好短,卧槽

来源路劲

代理服务器的来源有很多,我这里列举一些,希望大家补充一下自己知道的

- 学校实验室学生搭建的代理服务器自己用的,但是学生嘛,经验不足,没有做好权限控制,于是就多出了一台公共代理服务器了。
- 政府、机关、企业,和上面原因类似,自己搭建自用的代理服务器,没做好权限控制。
- 某些机构的蜜罐,用来盗取信息
- 某些机构的统计需求。信息采集。
- 实验性质的流量分析,开台公共代理获取一些流量作实验用途
- 一些小众软件的设计失误开出来的开放代理端口。

付费代理:ProxyBasicAuthHandler(代理授权验证)

9、Cookie原理

HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性,包括:

Cookie名字(Name)
Cookie的值(Value)
Cookie的过期时间(Expires/Max-Age)
Cookie作用路径(Path)

Cookie由变量名和值组成,根据 Netscape公司的规定,Cookie格式如下

Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

把浏览器请求学到headers即可,不复杂,尽可能伪装浏览器

10、Requests: 让 HTTP 服务人类  更加方便

超级强大:Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。

1、基本GET请求(headers参数 和 parmas参数)

非常强大,方便啊!

  • 使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。

  • 使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。

2、基本POST请求(data参数)

response = requests.post("http://www.baidu.com/", data = data)

和原来urllib2比起来少了转码,方便,直接自己转码


总结:前面都是打基础,第10个最有用,哈哈哈






你可能感兴趣的:(编程语言)