Python爬虫-urllib2(1)
@(博客)[python, 爬虫, urllib2, Python]
018.5.18
理解响应报头和请求报头
在这里不做知识延伸,我们只需要知道,当我们点开某个网页时,浏览器会向服务器发送请求(request)报文;而服务器反馈给浏览器响应(response)报文。之后,通过浏览器渲染,就是我们平时看到的样子了。
需要的库
python2爬虫中,常用库urllib,urllib2,前者主要使用url编码
,后者实现发送请求报文
等。
什么是url编码
同样的, 不做学术上的解释,我们用一个实例来理解。
首先我们随机打开一个贴吧,可以看到的是kw=之后有中文字
那么,我们复制一下url地址到文本编辑中来
事实上,真正的url地址是文本编辑器里的那样子,所以在我们构建请求报文的时候,url地址也必须是后者的样子,此时就需要urllib来实现url编码。
用法:urllib.urlencode()
url加码, urllib.unquote()
url解码
此时我们在终端输出一下:
需要说明的是,在urlencode()中的参数必须是字典;unquote()并非常用,偶尔也需要
如何发送一个请求
使用urllib2的默认发送请求方式:urllib2.urlopen(url地址)
,该方法会返回一个response对象
该对象常用以下几个方法:
response.read()
获取网页源码,即我们需要的部分
response.getcode()
获取响应状态码,常见为200,即成功
response.geturl()
获取真实访问的url地址(是否被重定向)
response.info()
获取响应报文
构建一个请求报头
使用urlopen()的确可以轻松+简单的获取到数据,但这仅仅是针对没有指定反爬措施的网站,如果你需要爬取的网站反扒措施很厉害,可能在你第一次发送请求之后你的ip就已经在对方服务器的黑名单里了。其原因是:,没有加工过的请求报文头会暴露你在“爬虫”。所以我们需要自主构建一个请求报文头:
urllib2.Request(url, data, headers)
请求方式分get和post,如果是get,那么data可不写;如果是post请求方式,则需要写上data。(此节暂不涉及post)
Request()的实例对象常用函数:
add_data(data)
如果实例化Request()时,没有添加data,则用该方法添加
add_header(key, val)
如果实例化Request()时,没有添加headers,则用该方法添加
get_data(data)
查看请求报文中的Form Data
get_header(key)
查看请求报文,指定查看信息
注:使用get_header()时,参数的第一个字母要大写,其余小写
构建发送方式
前面所说,urlopen()是很简单的发送请求的方式,但由于不够“隐蔽”,一般弃用,所以我们需要自己构建一个具有urlopen()一样功能的方法。
所用:
urllib2.HTTPHandler()
这是最基础的方法,后面还有代理ip的处理方法,此节不涉及
urllib2.build_opener()
实例化一个对象,这个对象的open()方法,具有urlopen()的功能
外加一不常用方法,但方便起见:
urllib2.install_opener(opener)
使用这一方法后,再使用urllib2.urlopen()实际上就是在调用opener.open(),(此节暂不做测试证明)
实现一个简单的、完整的爬虫小程序
#!/usr/bin/env python
# coding=utf-8
import urllib
import urllib2
#构建报文头,按实际情况添加
headers = {
"Accept-Language": "zh-CN,zh;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36",
}
#访问的url地址,随意打开的一个百度的新闻
url = "https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_16589717326535276089%22%7D&n_type=0&p_from=1"
#构建一个请求
request = urllib2.Request(url=url, headers=headers)
#构建opener
http_handler = urllib2.HTTPHandler()
opener = urllib2.build_opener(http_handler)
#发送请求并接受服务器的响应
response = opener.open(request)
#查看真实访问url地址,防止重定向
print response.geturl()
#写入txt文档
with open("王者荣耀.txt", "w") as ob:
ob.write(response.read())
需要说明的是:这是一个极简单的爬虫小程序,所以能发挥的作用很有限,首先被爬网页得是静态的,其次得是get请求方式,当然,这之后我们会一步步加大难度
一个小技巧
运行爬虫文件后,打开“王者荣耀.txt”会发现效果是这样的
由于都在一行查看是否爬虫正确是十分痛苦的,所以我们可以利用python2的内置功能搭建一个简易的网页服务器,在浏览器中呈现我们爬到的数据,借此验证是否爬去正确
第一步:mv 王者荣耀.txt index.html
第二步:python2 -m SimpleHTTPServer
在搭建的服务器中,服务器会自动调用命名为index.html的文件作为首页呈现,如果没有指定端口,默认端口是8000
运行之后的效果的是这样的
浏览器访问方式:ip:port