爬虫爬取策略
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 urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()
也可以换种写法:
import urllib2
request = urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
这里的urlopen方法的参数可以传入一个request请求(其实就是一个Request类的实例),两种写法都可以
HTTP定义了与服务器交互的不同方式
-- GET 【获取/查询】: 直接以链接形式访问,链接中包括了所有的参数
-- POST【更新】:把提交的数据放置在是HTTP包的包体中
下面看个POST的例子:
import urllib
import urllib2
values = {"username": "zhangsan@qq.com","password": "xxx"}
data = urllib.urlencode(values)
url = "https://passport.youkuaiyun.com/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_code
200
>>>response.headers['content-type']
'text/html; charset=utf-8'
>>>response.content
u'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.url
u'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_code
200 [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库
------未完待续