Chapter3 初识网络爬虫

1.1 网络爬虫及其应用

网络爬虫是安州某种一定的规则,自动的抓取万维网信息的程序和脚本。

网络爬虫按照系统结构和实现技术,大致可以分为:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。

传统的通用搜索引擎就属于通用性爬虫。

聚焦爬虫:是一个能自动下载网页的程序,他根据既定的抓取目标,有选择的访问互联网上的网页与相关的连接,获取所需要的信息。

增量式网络爬虫:对以下载网页采取增量式更新和只爬取新产生的 或者已经发生变化网页的爬虫,他能够在一定程度上保证所爬行的页面尽可能是新的页面。但是增加了爬行算法的复杂度和实现难度。

深层网络爬虫:可以爬取深层网络中的数据。

1.2网络爬虫结构

1)首先选取一部分精心挑选的种子URL

2)将这些URL放入待抓取URL队列

3)从待抓取URL队列中读取待抓取队列的URL,解析DNS,并得到主机的IP,并将URL对应的网页下载下来,存储进以下载网页库中,此外将这些URL放进已抓取URL队列

4)分析已抓取URL队列中的URL,从已下载的网页数据中分析出其他的URL,并和已抓取的URL进行比较去重,最后将去重过的URL放入待抓取URL队列,从而进入下一个循环。

2.3 更人性化的Reuqests

前面两种实现方式(urlib2/urlib  httplib/urlib)由于时间关系只做了大概的了解,下面着重解释下Requests方式。

Requests是第三方库,所以需要安装。

1.首先还是实现一个完整的请求与响应模型

以GET为例,最简单的形式如下:

import requests
r=requests.get('http://www.baidu.com')
print r.content

接下来是POST请求:

import requests
postdata={'key':'value'}
r=requests.post{'http://www.xxxxx.com/login' data=postdata}
print r.content

接着讲解下稍微复杂的方式,大家见过类似的URL:http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1,就是在网址后面紧跟着“?”,“?”后面跟着参数,这样的GET请求如何发送呢? 示例如下:

import requests
payload={'Keywords':'blog:qiyeboy','pageindex':1}
r=requests.get('http://zzk.cnblogs.com/s/blogpost',params=payload)
print r.url

2.响应与编码

import requests
r=requests.get('http://www.zhihu.com')
print 'content-->'+r.content
print 'text-->'+r.text
print 'encoding-->'+r.encoding
r.encoding='utf-8'
print  'new text-->'+r.text

书上说 text的输出结果是乱码的,但是我这看到的输出并不是乱码...有待考究,我想大概懂了是为什么了,因为B网站的字符编码已经是utf-8了,所以不需要再编码成utf-8了 ,正确与否有待考究。

import requests,chardet
r=requests.get('http://www.baidu.com')
print chardet.detect(r.content)
r.encoding=chardet.detect(r.content)['encoding']
print r.text

直接将chardet探测到的编码,赋给r.encoding实现解码,.text输出就不会有乱码了

除了上面那种直接获取全部响应的方式,还有一种流模式,示例如下:

import requests
r=requests.get('http://www.baidu.com',stream=True)
print r.raw.read(10)

3.请求头headers处理

Requests对headers的处理和urllib2非常相似,在Requests的get函数中添加headers参数即可,示例如下:

import requests
user_agent ='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r=requests.get('http://www.baidu.com',headers=headers)
print r.content

4.响应码code和响应头headers处理

获取响应码是使用Requests中的status_code字段,获取响应头使用的是Requests中的headers字段,示例如下:

#coding:utf-8
import requests
r=requests.get('http://www.baidu.com')
if r.status_code==requests.codes.ok:
    print r.status_code #响应码
    print r.headers#响应头
    print r.headers.get('content-type')#推荐使用这种获取方式,获取其中的某个字段
    print r.headers['content-type']#不推荐使用这种
else:
    r.raise_for_status()

5.Cookie处理

如果响应中包含Cookie值,可以通过如下方式获取Cookie字段的值,示例如下:

#coding:utf-8
import requests
user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r=requests.get('http://www.baidu.com',headers=headers)
#遍历所有的Cookie字段值
for cookie in r.cookies.keys():
    print cookie+':'+r.cookies.get(cookie)

如果想自定义Cookie值发送出去,可以使用以下方式:

import requests
user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
cookies=dict(name='qiye',age='10')
r=requests.get('http://www.baidu.com',headers=headers,cookies=cookies)
print r.text

还有一种更为高级,且能自动处理Cookie的方式,有时候我们不需要关心Cookie值是多少,只是希望每次访问的时候自动把Cookie带上,Requests提供session的概念。示例如下:

import requests
loginUrl='http://www.xxxxx.com/login'
s=requests.Session()#首先作为游客,服务器会先分配一个Cookie
r=s.get(loginUrl,allow_redirects=True)
datas={'name0:'qiye','passwd:':'qiye'}
#向登陆连接发送post请求,验证成功,游客权限转变为会员权限
r=s.post(loginUrl,data=datas,allow_redirects=True)
print r.text

6.重定向与历史信息

处理重定向只是需要设置一下,allow_redirects字段即可,例如r=requestss.get('http://www.baidu.com'.allow_redirects=True)。将allow_redirects设置为True则是允许重定向,如果允许重定向可以通过r.history字段查看历史消息。即访问成功之前的所有跳转消息,示例如下:

import requests
r=requests.get('http://www.github.com')
print r.url
print r.status_code
print r.history

7.超时设置

超时选项是通过参数timeout来进行设置的,示例如下

requests.get('http://github.com',timeout=2)

8.代理设置

使用代理Proxy,你可以为任意请求方法通过设置proxies参数来配置但个请求:

import requests
proxies={
    "http": "http://0.10.1.10:3128",
    "https": "http"//10.10.1.10:1080",
        }
requests.get("http://example.org",proxies=proxies)
小结:本章主要讲解了网络爬虫的结构和应用,以及Python实现HTTP请求的几种方法。希望大家对本章中的网络爬虫工作流程和Requests实现HTTP请求的方式重点吸收和消化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值