python爬虫之urllib

爬虫介绍

爬虫的定义就不多说了,其实就是从互联网这张大网上找到你需要要的数据,比如我们需要查询一些比较权威的数据,或者要用一些数据做统计工作,那么这些数据我们就可以直接从晚上把需要的数据抓取下来,存到文件也好,存到数据库也好,都是没问题的。
今天我们就先来说一下python最基本的urllib库是如何抓取数据的。

urllib使用

在Python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了,以先来看下urlopen函数基本的使用,来一个最单间的例子:抓取我们最常用的百度的首页页面。

from urllib import request
resp = request.urlopen("http://www.baidu.com")
print(resp.read())

这就是非常简答的一个抓取百度页面的抓取是了,是不是特别简单。

urllib工具的使用

urlretrieve函数

这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:

from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')

urlencode函数

有时候我们在百度输入汉字搜索,例如海贼王,然后复制url的时候,一般都是是这个样子
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B&oq=%25E6%25B5%25B7%25E8%25B4%25BC%25E7%258E%258B&rsv_pq=eaca7d4500009e43&rsv_t=23c3nUQ4jLe8PyOTvvCVV8iGhZrQORfpP7RJIngswIqVVx8umtKtkIFa9Lo&rqlang=cn&rsv_enter=1&inputT=4622&rsv_sug3=42&rsv_sug1=36&rsv_sug7=100&bs=%E6%B5%B7%E8%B4%BC%E7%8E%8B,其实就是浏览器encode后才把请求发给后端,这个时候我们就需要如下操作了

from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':100}
dataEncode = parse.urlencode(data)
print(dataEncode)

返回值是name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100
当然后编码就有解码

from urllib import parse
qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
print(parse.parse_qs(qs))

Request

上边我们介绍了一些基本的工具类的使用,但是在爬虫的时候,我们是希望尽可能的不要被识别出来,但是如果用上边的请求处理的话,只要人家稍微做一些反爬虫,就能知道我们是python来进行的爬虫,所以为了做一些伪装,我们要尽可能的模仿浏览器。模仿的越像,越不会被封ip。

添加请求头

我们在chrome浏览器右键选择检查的时候,在当前网页请求任何信息,都会看到,在network中会看到很多的请求,随便打开一个请求,都能看到如下内容
headers
所以我们在访问的时候,尽可能的多填写点这些数据,让反爬虫的机制不要从这些基本操作中就识别我们。比如要添加header和请求参数,例如如下请求,是一个拉勾网的的一个简单请求,返回json数据。


from urllib import request,parse
import ssl

context = ssl._create_unverified_context()

url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false"

header = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    "Referer":"https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput="
}

data = {
    "first": "true",
    "pn": "1",
    "kd": "java"
}
req = request.Request(url, headers=header, data=parse.urlencode(data).encode("utf-8"), method='POST')

resp = request.urlopen(req, context=context)

print(resp.read().decode("utf-8"))

这样这个请求过去,如果他们去看这个请求的头信息的User-Agent,是完全不能能发现我们是有问题的,如果不设置的话,那么请求的User-Agent就是python。

代理 proxyHandler处理器

有时候我们需要频繁的访问一个连接,比如天气预报,试试的检测,这样我们一个ip一直访问的话,确实是有些不好,人家很容易看出来,这时候我们就需要定期的伪装自己,找一个中介,让他来给我执行,学过设计模式的,大家都知道是什么意思。废话不多说,先看一下代码

from urllib import request

url = "http://httpbin.org/ip"

# ProxyHandler构建一个handler
# 使用handler构建一个opener
# opener构建请求

handler = request.ProxyHandler({"http":"101.65.24.16:8118"})
opener = request.build_opener(handler)
resp1 = opener.open(url)
print(resp1.read())

我的代理是网上找的,你也可以搜索一下免费的代理,但是还是非常的方便,这样我么读取到的数据,一定是代理的ip。

小结

上边总结了一些常用的工具信息,例如发送get请求,post请求,代理,下载,编码,解码这些东西,很简单,但是也基本满足了我们一些简单的开发需求,urllib库很强大,但是他也有不好的地方,有些地方稍显复杂,比如代理,如果设置搭理,就必须用opener来打开请求,每次都是先生成Request,然后在 request.urlopen(req, context=context)打开,总感觉多次一局,但是有比没有强,下节我们用官方的Request库来避免这些问题。

发布了176 篇原创文章 · 获赞 84 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/lovemenghaibin/article/details/82799793