python爬虫从零到0.5(一)

爬虫原理:由终端(个人电脑)通过向指定的服务器(域名url)发送请求(request)并得到一个响应(response),再由网页解析工具库(如BeautifulSoup库,正则表达式语言)使用标准化的解析语言对响应(response)的内容(response.text)或对象(response.selector)进行内容查找和解析,一般是对含有标签的网页代码进行解析。最后输出,输出的形式当可以是仅打印输出在终端上,如果有需要可以将得到的数据信息进行文本式的存储,格式可以是text,json,csv等。像scrapy这种爬虫式工具提供了标准化的操作,不仅可以精简代码,而且更方便存储数据。

准备:进行爬虫学习,首先要有python基本语法熟练掌握,对库,模块,类的理解要透彻,对如何在新建的py文档中调用各种库,类,函数要熟悉。

爬虫实现:可以由两种方式。第一是集成使用几种具有相对独立功能的库,如urllib(request,error,parse),requests,BeautifulSoup,pyquery等。urllib库包含一系列功能的模块,如request,其中的函数urlopen是进行网页请求,模块error包含各种可能出现的异常,模块parse进行url解析。requests库主要用于网页请求,它比urlopen更方便,主要有get()和post()两种请求方式。BeautifulSoup是常用的网页解析库,他可以使用python自带的解析语言库parse,或者指定别的解析语言库,如lxml,xml,html5lib等。pyquery库的pyquery模块中有一个PyQuery类,使用时传入目标进行初始化,成功返回一个PyQuery对象后,使用css语言对该对象进行个性化的选择。第二种实现爬虫的方式即使用scrapy之类的专门化的爬虫工具库,能够大大减少必要代码的输入,并且从建立项目到数据存储都有一整套标准化的命令行语言,十分的方便。

urllib库:是python自带的一个库,使用的主要功能模块有request,error,parse

request模块:主要使用的函数有urlopen(url,data=None,timeout=''),包含三个参数,返回一个HTTPResponse对象。参数url是执行请求的目标网址,必须传入一个字符串string,还可以添加后缀/get或/post指定请求的方式;data是post请求时,传入的数据参数,必须传入一个bytes类型;timeout设置相应的时间,如果超过设定值则返回一个timeout类的错误。

对urlopen返回的HTTPResponse对象(att-rs)的操作:rs.read(),读取rs的内容,返回一个bytes类型的结果,可以使用方法decode('')进行转码实现标准化输出。rs.status,响应的状态码。rs.getheaders()获取所有响应头内容,rs.getheader('')获取指定响应头内容。

error模块:包含了请求可能出现的2个异常类,第一个URLError(reason),第二个HTTPError(code,reason,headers),后者是前者的子类。在做异常处理的顺序,先从子类开始,在到父类,可以较全面的进行处理异常。

try:
except:子类
except:父类
else

parse模块:用到的函数有urlparse,urlunparse,urljoin,urlencode

urlparse(url,scheme='',allow_fragements='True'),功能是将传入的url按(scheme,netloc,path,params,query,fragment),进行分割,并返回一个ParseResult对象。scheme指定默认的协议类型,如果url中包括了协议类型则不生效。allow_fragments = False,忽略fragment的拆分,将内容向前拼接。

import urllib.parse as ps
url='http://www.baidu.com/index=html;user?id=5#comment'
result=ps.urlparse(url)
print(result)
ParseResult(scheme='http', netloc='www.baidu.com', path='/index=html', params='user', query='id=5', fragment='comment')

urllib.parse.unparse(data),将数组data进行拼接(scheme,netloc,path,params,query,fragment)全都要指定数值,不指定也要传递空‘’,返回一个完整的url字符串。
urllib.parse.urljoin(url1,url2)处理时:先将两个url拆分成6个元素,拼合时以后面的url2元素为基准,若对应元素有则用后者,若没有则从前者对应元素加入拼合。
urllib.parse.urlencode(dict),将字典的params(存储形式)转换成get请求的params(调用形式),并返回一个字符串形式的数据,多个参数用‘与&’链接

import urllib.parse as ps
dict = {
    'age':22
    'name':'Jay',
}
base_url='www.baidu.com?' # ?在url中提示params,#提示fragment
params = ps.urlencode(dict)
url=base_url+params
print(url)
www.baidu.com?name=Jay&age=22
requests库:

requests.get(url(/get),params,headers,verify,proxies,timeout,auth),返回一个Response对象

参数url/get返回的是response的body而不是网页源码
参数params接受一个字典类参数
参数headers接受一个字典类参数,提供包括user-agent在内的信息,使请求的服务器能正确识别并返回正确的信息
参数verify默认为True,当请求的协议是https,首先判断证书是否合法,若不合法会直接抛出SSLError这个错误,verify=False,则取消证书判断
参数proxies是指定请求使用的代理,接受一个字典类参数,设置代理主要是为了对付查封ip的反爬虫站点

#代理设置
requests.get(url(/get),proxies)
#给get方法的proxies传递一个端口的字典数据
    'http':'http://127.0.0.9743',#无密码
proxies={
    'http':'http://user:password@127.0.0.9743/',#有密码
    'https':'https://127.0.0.9743',
}
rsp=requests.get('https://www.taobao.com',proxies=proxies)

参数timeout是设置超时的时间

#超时设置
requests.get(url(/get),timeout=1)
抛出的错误在requests.exceptions类中,有Timeout,ReadTimeout...
from requests.exceptions import ReadTimeout

异常处理
Timeout是Http error的子类,是Error的孙子类。处理原则:由小到大

requests.post(url/post,data,headers,files)
参数data接受一个列表类参数,给post请求附加一个表单内容
参数files接受一个字典类参数,给予上传文件用的文档数据

import requests
files={
    'file':open('man.jpg','rb')
}
url='http://httpbin,org/post'
rsp = requests.post(url,files=files)

对返回的Response对象的属性进行操作:
response.status_code,int类型

response.content,获取二进制数据
response.text,获取文本数据,返回一个标准化的网页代码格式

#解析json:将请求返回的json格式的字符串,转换为json格式的数据,response.json()=json.loads(response.text)
response.headers,dict类型
response.cookies获取cookies,cookiejar类型,可以用字典的遍历来读取键值对数据
for key,value in rsp.cookies.items():
    print(key,value)

设置cookies,维持会话模拟登入

import requests
requests.get('http://httpbin.org/cookies/set/number/123456')#设置网站cookies,没有/get
rsp= requests.get('http://httpbin.org/cookies')#访问cookies

#以上无法得到设置的cookies,原因是两次get()分别执行,第二次不含有第一次的cookies信息

import requests
s=requests.Session()#模拟一个会话
s.get('http://httpbin.org/cookies/set/number/123456')
rsp= s.get('http://httpbin.org/cookies')#访问cookies的路径

#用requests.Session()声明一个Session对象,并以此来发送请求,两次请求都由同一个Session对象发出,第二次请求包含第一次设置的cookies信息
response.url ,string类型

response.history,list类型


つづく

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页