python爬虫基础知识

来源:互联网 发布:网易股票分时数据 编辑:程序博客网 时间:2024/05/01 09:41

爬虫爬取策略

1.广度优先:在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。


2.最佳优先:只访问经过网页分析算法预测为“有用”的网页


3.深度优先:可能会陷入trapped问题




DOM(Document Object Model)

中文名文档主题模型,DOM将HTML文档表达为树结构,定义了访问和操作HTML文档的标准



Cookie

由服务器端生成,发送给User-Agent(一般为浏览器),之后浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次访问同一网站时就发送该Cookie给服务器(当然,前提是浏览器设置为启用Cookie)




Urllib2库的一些常用函数

urlopen(url,data,timeout)

--第一个参数url为URL

--第二个参数data是访问URL时要传送的数据

--第三个参数timeout是设置超时时间,也就是设置一个阈值,当超过该阈值时,不继续访问该网址


read()

--可以返回获取到的网页内容


下面我们看个例子:

import urllib2response = urllib2.urlopen("http://www.baidu.com")print response.read()

也可以换种写法:


import urllib2request = urllib2.Request("http://www.baidu.com")response = urllib2.urlopen(request)print response.read()

这里的urlopen方法的参数可以传入一个request请求(其实就是一个Request类的实例),两种写法都可以




HTTP定义了与服务器交互的不同方式

-- GET 【获取/查询】: 直接以链接形式访问,链接中包括了所有的参数


-- POST【更新】:把提交的数据放置在是HTTP包的包体中


下面看个POST的例子:

import urllibimport urllib2values = {"username": "zhangsan@qq.com","password": "xxx"}data = urllib.urlencode(values)url = "https://passport.csdn.net/account/login?xxx = yyyy"request = urllib2.Request(url,data)response = urllib2.urlopen(request)print response.read()



Headers设置

-- User-Agent:部分服务器或Proxy会通过该值来判断是否是浏览器发出的请求


-- Content-Type:在使用REST接口时,服务器会检查该值,用来确定HTTP Body中的内容该怎么解析


-- application/xml:在XML RPC,如RESTful/SOAP调用时使用


-- application/x-www.form-urlencoded:浏览器提交Web表单时使用




Urllib与Urllib2之间的区别

-- urllib2可以接受一个Request类的实例来设置URL请求的headers, urllib只可以接受URL,这样的话,就不可以伪装自己的User Agent字符串等


-- urllib提供urlencode方法来GET查询字符串的产生,而urllib2没有,这就是为什么urllib经常和urllib2一起使用的原因(urlencode方法,可以把key-value这样的键值对转化成我们想要的格式,返回的是

    a=1&b=2这样的字符串


下面看一个例子:

import urllib import urllib2 url = 'http://www.zhihu.com/login' user_agent = 'Mozila/5.0(compatible;MSIE 5.5;WindowsNT)' values = {'username' :'Lee','password':'XXXX'} headers = {'User-Agent':user-agent} data = urllib.rulencode(values) request = urllib2.Request(url,data,headers) response = urllib2.urlopen(request) page = response.read()




requests库

-- requests库用起来更加便捷,下面看一个例子:


>>> import requests>>> url = 'http://example/com/'>>> response  = requests.get(url)>>> response.status_code200>>>response.headers['content-type']'text/html; charset=utf-8'>>>response.contentu'Hello,world!'


发送请求

-- r = requests.get('https://github.com/timeline.json')  【GET】

-- r = requests.post("http://httpbin.org/post")  【POST】


为URL传递参数

>>>payload = {'key1':'value1','key2':'value2'}>>>r = requests.get("http://httpbin.org/get",params=payload)>>>print r.urlu'http://httpbin.org/get?key2=value2&key1=value1'

响应内容
>>>r = requests.get('https://github.com/timeline.json')>>>print r.text'[{"repository":{"open_issues":0,"url":"https://github.com/...


响应状态码

>>>r = requests.get('http://httpbin.org/get')>>>print r.status_code200 [OK] OR 403 [禁止访问]

响应头

>>>print r.headers>>>print r.headers['Content-Type'] 'application/json;charset=utf-8'

cookies

>>>print r.cookies['example_cookie_name']

超时

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



错误与异常

-- Requests异常一般都继承于requests.exceptions.RequestException


--遇到网络问题(DNS查询失败,拒绝连接等)时,Requests会抛出一个ConnectionError异常


-- 若请求超时,则抛出一个Timeout异常


-- 遇到罕见的无效HTTP响应时,Requests则会抛出一个HTTPError异常


--若请求超过了舍得的最大重定向次数,则会抛出一个TooManyRedirects异常




正则表达式(regular expression)

-- 描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等




Lxml

-- 是一个强大的处理HTML与XML的python库




------未完待续



































0 0