python爬虫入门(一)
由于学习的需要,最近学习了爬虫知识,学习之余把最近学习的知识进行整理方便以后查看,顺便和其他小伙伴一起交流学习爬虫的心得。
1. 什么是爬虫
如果把互联网比喻成一张蜘蛛网的话,那么各种硬件设施(服务器,pc机等)就是附着在这张蜘蛛网上的一只只蜘蛛,同时各种网络资源存放在不同的硬件设施中,而爬虫就是沿着这张蜘蛛网,到每一个硬件设施中找到自己需要的资源,将这些资源爬取到自己的硬件中的一个程序。
2.哪些语言可以写爬虫
现在各种主流语言一般都支持爬虫,如java,python,c++等,本文主要介绍的是由python编写的爬虫(python版本为3.7)。
3.urllib
urllib库是python的一个内置库,也是我们初学爬虫时一个非常重要的库,它可以向服务器发送请求并获得网络资源,首先我们先来了解一下urllib。
import urllib
print(dir(urllib))
[’__builtins__’, ‘__cached__’, ‘__doc__’, ‘__file__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__path__’, ‘__spec__’, ‘error’, ‘parse’, ‘request’, ‘response’]
可以看到除了python内置的属性之外,urllib还包括四个属性:error、parse、request、response,python官方解释如下:
request:Extensible library for opening URLs(用于打开url的可扩展库,也就是说,这个属性可以用来打开我们需要的url地址)
error:Exception classes raised by urllib.request(urllib.request引发的异常类)
parse: Parse URLs into components(将URL解析为组件)
response:Response classes used by urllib(urllib使用的响应类)
其中最重要的就是request这个属性,我们访问url地址时使用的就是这个属性,其他的属性功能在后面我们也会介绍
4.request
request最简单的操作就是打开一个url地址
# -*- coding: utf-8 -*-
#引入urllib.request
import urllib.request
#使用urllib下的urlopen方法打开url地址
response=urllib.request.urlopen("https://www.baidu.com")
print(response.read())
可以看到通过使用request的urlopen方法,得到了一个上下文管理工作器的对象,通过其read方法得到了响应对象的字节数组。或者可以指定read方法的字符集来改变文本的输出方式。
#引入urllib.request
import urllib.request
#使用urllib下的urlopen方法打开url地址
response=urllib.request.urlopen("https://www.baidu.com")
print(response.read().decode("utf8"))
将read方法的字符集改为utf8之后,结果按一般字符串输出
下面我们详细介绍一下request下的urlopen方法,python官方给定的文档中对其的定义如下:\
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
可以看到urlopen除了可以传递需打开的url地址这一个参数之外,还可以传递其他几个参数,其具体意义如下:
data:需要传递的参数,在url地址中,我们经常需要传递参数,如www.XXXX.com?name=python,其中name=python就可以通过data参数传递。需要注意的是:
1.一般使用data传递参数,那么请求就是POST请求,如果不使用,则默认是GET请求。
2.data参数规定必须传递的是bytes object,也就是字节数组,一般我们使用urllib.parse.urlencode()来进行参数转换,具体的操作后面会进行演示
timeout:用来设置超时时间,防止请求时间过长,单位是秒,不填使用默认时间
cafile:是指向单独文件的,包含了一系列的CA认证 (很少使用,默认即可)
capath:是指向文档目标,也是用于CA认证(很少使用,默认即可);
cadefault:可以忽略
context:设置SSL加密传输(很少使用,默认即可)
下面我们写一个传递参数的小例子:
import urllib.request
import urllib.parse
#使用urllib.parse.urlencode方法进行参数转换,再将转换后的参数转为字节数组
param=bytes(urllib.parse.urlencode({"name":"python","password":"123"}),encoding="utf8")
#http://httpbin.org/post,这个网站可以查看我们访问时的各种信息,包括传递的参数等
response=urllib.request.urlopen("http://httpbin.org/post",data=param,timeout=3)
print(response.read().decode("utf8"))
通过获得的结果我们可以看到我们成功访问url,并成功传递name,password两个参数给服务器、
添加请求头
打开浏览器调试模式,我们可以看到浏览器的每一次请求其实都包括很多头部信息:
如不过将这些头部信息写入我们的请求中去的话,服务器很容易就知道我们是一个爬虫而不是一次请求,从而可能会阻止我们的访问,重新运行上一次代码,我们可以看到
目标服务求已经识别我们为一个python爬虫,所以,我们要在请求时添加必要的头部信息
import urllib.request
import urllib.parse
#包装头部信息
header={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"}
#urllib.request.Request方法中可以设置url地址,data,headers等等,其中heanders表示需要添加的头部,method表示请求的方法,同时会返回一个request对象
request=urllib.request.Request("http://httpbin.org/get",headers=header,method="get")
response=urllib.request.urlopen(request)
print(response.read().decode("utf8"))
可以看到,我们已经成功将自己伪装为一个谷歌浏览器