您的位置:首页 > 理论基础 > 计算机网络

Python网络爬虫学习笔记(第一周)

2017-08-30 11:27 351 查看

Pyhon网络爬虫学习

Request库入门

Request是目前公认的最好用的爬虫库

安装方法

pip install requests


测试库:import requests

7个主要方法

.request()
注意没有s,用于构造一个请求,且支撑以下所有方法

.get()
获取HTML页面的主要方法,对应于HTTP的get

.head()
获取HTML页面头信息的方法,对应于HTTP的HEAD

.post()
向网页提交POST请求

.put()
向网页提交PUT请求

.patch()
向网页提交局部修改请求

.delete()
向网页提交删除请求

其实requests只有request一个基本方法,其他方法只是封装了request

Requests异常

1. ConnectionError  网络连接异常
2. HTTPError        http协议上错
3. URLRequired      url缺失造成的异常
4. TooManyRedirects 超出最大重定向次数(爬复杂网站可能会碰到)
5. ConnectTimeout   连接远程服务器超时(仅仅是与远程服务器连接过程超时)
6. Timeout          请求url超时(从发起请求到获得内容的时间超出预定时间)


r.raise_for_status()
如果返回状态吗不是200产生httperror,否则返回true

Response对象

r = requests.get("http://www.baidu.com")
>>> type(r)         #显示r的类型为Response对象


>>> r.status_code       #返回状态码,200代表访问成功,404代表失败
>>> r.headers           #显示网页头部信息
>>> r.text              #打印url对应的页面内容(字符串形式)
>>> r.encoding          #从页面的header中charset字段获取的编码方式
>>> r.apparent_encoding #页面编码方式(从内容中分析出的编码方式)
>>> r.content           #页面相应内容的二进制形式


如果header中不存在charset,则默认编码为ISO-8859-1,不能解析中文哦^_^

r.encoding = r.apparent_encoding


爬虫代码框架

import requests

def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()    #如果状态码不是200,产生HttpError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "ERROR"

if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))


HTTP协议

HTTP,Hypertext Transfer Protocol,超文本传输协议

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议

用户发起请求,服务器相应——请求与响应

无状态是指本次与下一次访问无关联

采用url作为定位网络资源的标示

url格式:
http://host[:port][path]


1. host是主机域名或者ip地址

2. port是端口号,缺省端口80

3. path是请求资源的内部路径

HTTP对资源的6种操作

GET
请求获取URL位置的资源

HEAD
头部信息

POST
请求向url位置的资源后附加新的数据,不改变现有资源内容

PUT
请求向url位置存储一个资源,会覆盖掉url位置资源,未提交的会被删除

PATCH
请求局部更新url位置的资源

DELETE
请求删除url位置的资源

request()

requests.request(method,url,**kwargs)


method:请求方式,对应get/put/post等。6种+”OPTIONS”(获取能与服务器交互的方式)

kwargs,代表13个控制访问参数

13个控制访问参数

params: 字典或字节序列,作为参数增加到url中

data: 字典、字节序列、文件对象,作为Request内容

json: 作为Request内容

headers: 字典,定制http的协议头,比如修改’user-agent’字段来模拟浏览器

cookies: 字典或cookiejar,Request中的cookie

auth: 元组,支持http认证功能

files: 字典类型,传输文件

fs = {'file':open('data.xls','rb')}
r = requests.request('POST','http://www.baidu.com',files=fs)


timeout: 设置超时时间,以秒为单位

proxies: 字典类型,设置访问代理服务器,可以增加登录认证,隐藏自己的访问信息

allow_redirects: 默认为true,是否允许重定向

stream: 默认true,url内容是否立即下载

verify: 默认true,认证ssl证书开关

cert: 本地ssl证书路径

get()

简单获取一个网页
r = requests.get(url)


1. 用于构造一个向服务器请求资源的Request对象

2. 返回了一个包含了爬虫返回的全部内容的Response对象

requests.get(url,params=None,**kwargs)


url是链接

(可选)params是url中的额外参数,字典或者字节流格式

(可选)除了params的12个控制访问参数

head()

requests.head(url,**kwargs)


post()

requests.post(url,data=None,json=None,**kwargs)


除了data和json的11个控制访问参数

put()

url,data,kwargs

patch()

url,data,kwargs

delete()

url,kwargs

网络爬虫的“盗亦有道”

 网络爬虫的尺寸

小尺寸,只是用来爬取网页,requests库就可以

中尺寸,用于爬取网站,对速度敏感的,使用Scrapy库

大尺寸,用于爬取全网,常见于搜索引擎,定制开发

服务器限制网络爬虫的方法

1. 来源审查,限制http的user-agent字段来拒绝网络爬虫

2. 发布Robots协议

Robots协议

Robots Exclusion Standard 网络爬虫排除标准

在网站根目录下robots.txt文件

http://www.jd.com/robots.txt来访问京东的robots协议

无robots协议则表示允许所有爬虫不限制爬取其网站资源

约束性:建议遵守,如果不遵守,可能会存在法律风险

类人行为可不遵守robots协议

User-agent: *       #*代表所有
d827

Disallow: /         #/代表根目录


本周实例

京东商品爬取

import requests
url = "https://item.jd.com/5327260.html?utm_source=kong&utm_medium=zssc&utm_campaign=t_1000027280_85&utm_term=1410a462-637a-41ac-8af2-8bfcdc2a31ff-p_1999-pr_249-at_85&jd_pop=1410a462-637a-41ac-8af2-8bfcdc2a31ff&abt=0"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except:
print("ERROR")


亚马逊商品爬取

import requests
url = "https://www.amazon.cn/dp/B07524LHMT/ref=cngwdyfloorv2_recs_0/461-5225947-5332108?pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2&pf_rd_r=QV7CXXJ1V0N1QT70KV7N&pf_rd_r=QV7CXXJ1V0N1QT70KV7N&pf_rd_t=36701&pf_rd_p=19fc3fc8-b320-45dc-a7e8-b4ecd543eea8&pf_rd_p=19fc3fc8-b320-45dc-a7e8-b4ecd543eea8&pf_rd_i=desktop"
try:
kv = {'user-agent':'Mozilla/5.0'}   #Mozilla是一个标准的浏览器
r = requests.get(url,headers=kv)    #更改头文件的user-agent字段
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[1000:2000])
except:
print("ERROR")


百度/360搜索关键字提交

百度关键词接口
http://www.baidu.com/s?wd=keyword


360关键词搜索借口
http://www.so.com/s?q=keyword


import requests
keyword = "Python"
try:
kv = {'wd':keyword}     #构造关键词键值对
r = requests.get("http://www.baidu.com/s",params=kv)
print(r.request.url)    #打印url地址
r.raise_for_status()
print(len(r.text))
except:
print("ERROR")


网络图片的爬取和存储

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