前言
从二三月开始自学Python开始,到后来被傻叉项目折腾了半年多的时间,一直停滞了这么久,现在重新整理一些爬虫的资料,比较散碎,单纯的是从开发马上上手的角度记录的,这些基础知识绝大多数是通过学习崔庆才老师的精品博客进行的摘要,原版还是要看崔老师的博客,再次感谢崔老师无私奉献的资料👏👏👏
urllib2【171107】
基本使用
- 导包
import urllib2
- openUrl 看下定义
- 唯一必填的是
url
-
data
用于传参数 -
timeout
超时时间 - 返回值是 响应实体 response
- 通过 response.read 获取响应体信息
- 唯一必填的是
def urlopen(url,
data=None,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
cafile=None,
capath=None,
cadefault=False,
context=None):
- 代码
def open_url():
url = ""file:///Users/user/Documents/myGit/react-demos/demo01/index.html""
response = urllib2.urlopen(url)
print response.read()
- 执行结果
我的链接指向的是本地的一个HTML
带参数访问 GET & POST 访问
-
前文所叙,将参数直接或者间接放在data 中,data为字典类型
-
GET 访问
- 参数需要格式化一下,需要库`import urllib
- get 访问其实就是把处理后参数拼接成一个url字符串
- 例子
# GET 获取
def open_with_get():
url0 = "http://client.hs.vread.com/operation/getQuestionList.json?"
# 参数,字典类型
params = {"page": 1, "page_size": 10}
# 参数格式化
data = urllib.urlencode(params)
url = url0 + data
request = urllib2.Request(url)
response = urllib2.urlopen(request)
print response.read()
- POST 访问
- 和 get 不同的是,参数不能直接拼接在链接中,要写在字典中,
- 手头没有合适的post 例子,将上面get的例子改为post ,不能执行,只是看一下格式
- 例子
# Post 获取
def open_with_post():
url = "http://client.hs.vread.com/operation/getQuestionList.json"
# 参数,字典类型
params = {"page": 1, "page_size": 10}
# 参数格式化
data = urllib.urlencode(params)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
print response.read()
urllib2 的高级用法
HTTP 请求头参数
- User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
- Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
- application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
- application/json : 在 JSON RPC 调用时使用
- application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用
在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务
在某些爬虫操作中,需要对请求头中个别值进行设定,具体的操作是
- header 用一个字典进行接收,
- 需要进行拼接的字段作为key,值用字符串
- 拼接好的header 作为参数,再构建Request的时候传入
- 示例代码
url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'username' : 'cqc', 'password' : 'XXXX' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
page = response.read()
获取cookie
opener
- 定义: urllib2.OpenerDirector的实例
- 当通过url访问资源的时候,就是通过opener
- 前面 urllib2.urlopen 就是使用默认的opener
- 它是一个特殊的opener,
- 可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
获取cookie
- 导包
import cookielib
- 通过
cookielib.CookieJar()
创建cookie实例,用于存放cookie- 如果此cookie是可以由文件进行读取和存储到文件的,则使用
cookielib.MozillaCookieJar(文件路径)
- 存储的时候需要传参,参数为路径
- 如果此cookie是可以由文件进行读取和存储到文件的,则使用
- 通过
urllib2.HTTPCookieProcessor(cookie实例)
创建 cookie处理器,参数为cookie实例 - 通过
urllib2.build_opener(cookie处理器)
创建opener,参数为cookie处理器 - 例子
# 获取cookie
def get_cookie():
# 声明一个cookieJar来存放cookie
cookie = cookielib.CookieJar()
# 创建一个cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
# 通过处理器来创建opener
opener = urllib2.build_opener(handler)
response = opener.open("https://www.zhihu.com")
for item in cookie:
print 'Name = ' + item.name
print 'Value = ' + item.value
存储 读取cookie
- 调用cookie实例的save方法存储
- 参数1:gnore_discard的意思是即使cookies将被丢弃也将它保存下来
- 参数2: ignore_expires的意思是如果在该文件中cookies已经存在
- 调用cookie实例的load 方法读取
- 参数0:cookie文件的全路径
- 参数1:gnore_discard的意思是即使cookies将被丢弃也将它保存下来
- 参数2: ignore_expires的意思是如果在该文件中cookies