Python爬虫-urllib2(1)

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) 请求方式分getpost,如果是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
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41359051/article/details/80371255
今日推荐