本篇博客主要用于学习交流,用来记录自己学习过程中遇到的问题,所获得的感想,同时也为了方便以后的查找与回顾。另外也为了向各位前辈学习,纠正自己思考上的不足。文中可能会引用其他前辈的博客,文末会给出相应链接,侵删!
前言
自己一直想了解一些爬虫的知识及进行应用,从网上学习了一些前辈们的爬虫方法,用Python 3.6实现了简单的应用,爬取了百度翻译、有道翻译、谷歌翻译的页面。
网络爬虫(又被称为Web Spider),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字,比如蚂蚁、自动索引、模拟程序或者蠕虫。如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址(即URL)来寻找网页的。
URL,即统一资源定位符。在WWW上,每一个信息资源都有一个统一且唯一的地址,该地址就叫URL(Uniform Resource Locator),它是WWW的统一资源定位标志,也就是指网络地址。
URL的一般格式为: protocol :// hostname[:port] / path / [;parameters][?query]#fragment
(1)protocol(协议)
指定使用的传输协议。 最常用的是HTTP协议,它也是目前WWW中应用最广的协议。
(2)hostname:主机名。
是指存放资源的服务器域名系统(DNS)的主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。
(3)port(端口号)
整数,是可选项,省略时使用协议的默认端口。各种传输协议都有默认的端口号,如http的默认端口为80。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。
(4)path(路径)
由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。网络爬虫就是根据这个URL来获取网页信息的。
(5)parameters(参数)
这是用于指定特殊参数的可选项。
(6)query(查询)
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数。当有多个参数时,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
(7)fragment(信息片断)
字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
运行平台:Windows
Python版本:Python3.6
IDE:PyCharm
# coding:utf-8
import urllib
import chardet
from urllib import request
# 爬取百度翻译
response = request.urlopen("http://fanyi.baidu.com/") #
html = response.read()
# charset = chardet.detect(html) # 查看编码类型
# print(charset)
html = html.decode('utf-8') # 对二进制码进行解码
print(html)
我们用urllib库进行爬取页面。urllib库是python内置的,无需我们额外安装,只要安装了Python就可以使用这个库,但request库是第三方库,需要我们自己安装,可以使用pip安装。
urllib使用使用request.urlopen()打开和读取url相关信息,返回的对象response就像一个文本对象,我们可以调用read(),进行读取,再通过print(),将读取的信息打印出来。但此时我们得到的都是二进制码,需要对其进行解码。解码时,需要首先知道该页面使用的是那种编码方式。有两种方式可以查看。
我们可以看到,该页面的编码方式是utf-8.
2. 另一种方式是使用代码的方式,自动检测该页面的编码方式,即使用chardet.detect()的方式进行检测。
当我们得到二进制码以及知道了编码方式之后,我们就可以对其进行解码,转化成我们熟悉的HTML语言。
爬取之后得到百度翻译网页的内容:
相对的,我们也可以爬取有道翻译的页面,只不过换一下网址。
# coding:utf-8
import urllib
import chardet
from urllib import request
# 爬取有道翻译
response = request.urlopen("http://fanyi.youdao.com/")
html = response.read()
charset = chardet.detect(html) # 查看编码类型
# print(charset)
html = html.decode('utf-8') # 对二进制码进行解码
print(html)
显示爬取的有道翻译
另外,我们也可以爬取谷歌翻译。但爬取谷歌翻译时,如果还是按照上面的方法,会遇到问题。会显示urllib.error.HTTPError: HTTP Error 403: Forbidden 的错误。
Traceback (most recent call last):
File "F:/PycharmProjects/StudyPython/May/StudySpider5.31.py", line 9, in
response = request.urlopen("http://translate.google.cn")
File "F:\Installed\Python\Python36\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "F:\Installed\Python\Python36\lib\urllib\request.py", line 532, in open
response = meth(req, response)
File "F:\Installed\Python\Python36\lib\urllib\request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "F:\Installed\Python\Python36\lib\urllib\request.py", line 570, in error
return self._call_chain(*args)
File "F:\Installed\Python\Python36\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
File "F:\Installed\Python\Python36\lib\urllib\request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
Process finished with exit code 1
之所以出现上面的异常,是因为如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器、操作系统、硬件平台等信息,而缺失这些信息的请求,往往都是非正常的用户访问,例如爬虫。
有些网站为了防止这种非正常的访问,会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者不存在,那么这次请求将会被拒绝(如上错误信息所示),解决这个问题,可以尝试在请求中加入UserAgent的信息。修改后的代码如下。
# coding:utf-8
import chardet
from urllib import request
# 爬取谷歌翻译
urls = "https://translate.google.cn"
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
# response = request.urlopen(url = urls, headers = header)
response = urllib.request.Request(url = urls, headers = header)
html = urllib.request.urlopen(response).read()
charsetType = chardet.detect(html)
html = html.decode('utf-8') # 对二进制码进行解码
# print(charsetType)
print(html)
爬取谷歌翻译结果
这次爬取了三个比较常用的翻译页面的代码,页面比较简单,也容易分析。通过此次爬取,对如何获取URL中的信息有了一定了解,对爬取的过程有了初步认识。