什么是网络爬虫
网络爬虫英文可以叫crawler,也可以叫spider,简而言之就是利用计算机从网上抓取你所感兴趣的文件、图片、视频等。其实在大多数情况下,没有什么网络爬虫,我们也可以根据自己所需要的,通过浏览器从网上下载东西,(而网络爬虫的实质也是在模仿浏览器进行一系列的操作)但是如果我们所要的东西特别多时,例如要下载10000张图片,一个个用手去点岂不太麻烦了,所以我们需要利用到计算机来帮助我们爬取。
爬虫中用到的常用工具
用计算机进行数据的抓取的能动性肯定不如手动,但我们将抓取的逻辑、规律告诉计算机,那他的动作将变得很快,编写爬虫程序的过程也就是寻找规律的过程。
我们都知道网络上的资源都有属于自己的URL,我们所要做的就是一步步的寻找所要资源的URL,并把寻找URL的规律告诉计算机,通过URL来下载资源。
对于前期的探索工作,我们就需要借助一些工具,通过这些工具来了解对一个URL进行访问的时候到底发生了什么,最常见的就是浏览器自带的“开发者工具”,一般在浏览器的右上角可以找到,把他打开,点开web控制台中的网络一栏,当我们进行网页的打开、链接的点击时,控制台中就会显现出受到的数据包,从这些数据包中就可以看到请求的url,请求方式,请求头,响应头,响应内容等。
还有一个比较常用的工具叫Fiddler,是一个专业的抓包软件,他的作用就相当于一个中间人,站在通信的两个人中间,信息的流通都会经过他,这样来往了什么内容他都能获取。
在写爬虫程序的时候能灵活的运用这些工具会带来很大的便利。
用Python写爬虫
编程语言只是达到目的的工具,不是目的本身,用其他语言也可以用来写爬虫,比如JAVA,但相比Python,从一个“Helloworld”就可以看出JAVA的代码量较大,对于一个小的爬虫来说,有点冗余,并且由于Python有着庞大的第三方库的支持,近年来还在不断成长,咱不能说Python比JAVA好,但就爬虫来说,用Python较为适合。
urllib库
urllib是python中用于模拟浏览器发送请求的库,是python自带的,不需要另外下载的。在urllib中包含四个模块:
1.request:是用于模拟浏览器发送请求的核心模块。
2.parse:是一个对URL进行处理的模块,进行URL编码解码。
3.error:处理在爬取过程中发生异常的模块,例如没网,连接失败等。
4.robotparser:用于解析robot.txt文件的模块,robots.txt是用来告诉搜索引擎网站上哪些内容可以被访问、哪些不能被访问。当搜索引擎访问一个网站的时候,它首先会检查网站是否存在robots.txt,如果有则会根据文件命令访问有权限的文件。
在这四个模块当中较为常用是前两个,如果想把程序写的漂亮,第三个也会用到,接下来主要就request,parse做一些介绍。
urllib.request
urllib.request当中最常用的方法是urlopen(url),即向指定的url发送请求,他会返回一个对象,对象包含着返回回来的各种信息,实例如下:
import urllib.request #导入库
url='http://www.baidu.com/'
response = urllib.request.urlopen(url)#发送请求,返回对象
print(response.read().decode())
输出结果如下:
response对象还有以下常用方法:
方法 | 作用 |
---|---|
geturl() | 获取请求的URL |
getheaders() | 获取头信息 |
getcode() | 获取状态码 |
readlines() | 按行读取,返回列表 |
read() | 读取内容,内容为字节类型 |
request中还有一个常用的方法叫Request(),他的作用是创建一个请求对象,通常用urlopen()发送请求时,传递一个url就行了,但我们知道双方进行通信之后,你的各种信息那边都会知道,比如用的什么浏览器,当我们用爬虫程序进行网站的访问时,那边会知道,进而可能会限制我们的爬取,所以我们得创建请求对象,伪装自己是浏览器,所以就得伪装自己的头信息headers,在其中加入user-agent,这个可以通过抓包工具知道自己的浏览器的user-agent是什么,也可以从网上查。
headers是一个字典,代码如下:
import urllib.request
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'
}
url="http://www.baidu/com/"
request=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(request)
urllib.parse
url只能由特定的字符组成,例如字母,数字,下划线,如果出现其他的,就要对其进行编码,例如中文。
当我们在浏览器中输入“https://www.baidu.com/baidu?wd=网络爬虫”时,按下回车,会显示出网络爬虫的搜索页面,但把这个url用到我们得程序中的话却执行不成功,这是由于,浏览器自动把后面的“网络爬虫”编译成这种形式:
“%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB”
人只能看懂‘网络爬虫’,但上面那个是看不懂的,所以我们要利用parse来将url进行编码。
import urllib.request #导入库
import urllib.parse
url='http://www.baidu.com/baidu?wd=网络爬虫'
b=urllib.parse.quote(url)#编码
j=urllib.parse.unquote(b)#解码
print(b+"\n"+j)
结果如下:
从结果来看还算成功,但它把“http://”等内容也编码了,我们可以只对后面的进行编码,然后再拼接上去。
有的时候url中的参数给的是字典类型时,可以用urlencode()方法将字典中的内容拼接并编码:
import urllib.parse
data={'wd':'网络爬虫','ie':'utf-8'
}
s=urllib.parse.urlencode(data)
print(s)
urlencode()方法也经常用在post请求当中。
何为post,说到post就不得不说get,这俩都是在客户机和服务器之间进行请求-响应时,最常被用到的方法,上面的实例代码对URL的访问都是get方式的,get是从指定的资源请求数据,post是向指定的资源提交要被处理的数据。举个例子,当你要访问一个网站时,输入那个网站的网址就可以看到网站上的各种资源,这个get请求,当你是那个网站的用户,要登录时,会输入账号,密码,再按登录,这个请求过程就是post,你传递了你的账号密码,让对方处理,进入你的主页面。
get方式url中的参数(例如上面的“wd=网络爬虫”)一般是跟在url后面的,他的长度一般都有限制,英文名叫query_string。post方式的参数是以表单形式传递的,在代码中一般写成一个字典,再用urlencode()进行转换,英文名叫form_data。
import urllib.request
import urllib.parse
headers={ #请求头'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'
}
url="..."
form_data={#表单数据'k':'v',...
}
request=urllib.request.Request(url=url,headers=headers)#构建请求
form_data=urllib.parse.urlencode(form_data).encode()#处理表单数据
response=urllib.request.urlopen(request,form_data)#发生请求