Python3 网络爬虫——爬取简单的网页

本篇博客主要用于学习交流,用来记录自己学习过程中遇到的问题,所获得的感想,同时也为了方便以后的查找与回顾。另外也为了向各位前辈学习,纠正自己思考上的不足。文中可能会引用其他前辈的博客,文末会给出相应链接,侵删!

 

前言

自己一直想了解一些爬虫的知识及进行应用,从网上学习了一些前辈们的爬虫方法,用Python 3.6实现了简单的应用,爬取了百度翻译、有道翻译、谷歌翻译的页面。

 

1、爬虫定义

网络爬虫(又被称为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直接定位到某一名词解释。

 

2、爬取简单页面

运行平台:Windows 
Python版本:Python3.6
IDE:PyCharm

 

2.1 爬取百度翻译

# 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(),将读取的信息打印出来。但此时我们得到的都是二进制码,需要对其进行解码。解码时,需要首先知道该页面使用的是那种编码方式。有两种方式可以查看。

  1. 在该页面上点击右键,点击检查元素,在...中找到 meta charset ,后面的值就是该页面使用的编码方式。如图所示。

Python3 网络爬虫——爬取简单的网页_第1张图片

        我们可以看到,该页面的编码方式是utf-8.

    2. 另一种方式是使用代码的方式,自动检测该页面的编码方式,即使用chardet.detect()的方式进行检测。

    当我们得到二进制码以及知道了编码方式之后,我们就可以对其进行解码,转化成我们熟悉的HTML语言。

    爬取之后得到百度翻译网页的内容:

Python3 网络爬虫——爬取简单的网页_第2张图片

 

2.2 爬取有道翻译

    相对的,我们也可以爬取有道翻译的页面,只不过换一下网址。

# 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)

显示爬取的有道翻译

Python3 网络爬虫——爬取简单的网页_第3张图片

2.3 爬取谷歌翻译

    另外,我们也可以爬取谷歌翻译。但爬取谷歌翻译时,如果还是按照上面的方法,会遇到问题。会显示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)

爬取谷歌翻译结果

 

3、总结

在爬取的过程中,无意间发现百度翻译和有道翻译的网址中,对 翻译 这个词的译法都只是 翻译 的汉语拼音,也许是为了符合中国人的使用习惯吧!而谷歌翻译的网址却是实实在在的英文 translate !三个页面中,谷歌翻译考虑到了Uer-Agent,其他两个都没考虑,谷歌翻译考虑的应该更全面一些。尽管三个页面看起来很简洁,但经过爬取,能看到,每一个页面后都包含大量代码,足以显示出程序员们的用心!

这次爬取了三个比较常用的翻译页面的代码,页面比较简单,也容易分析。通过此次爬取,对如何获取URL中的信息有了一定了解,对爬取的过程有了初步认识。

 

4、参考资料

  1. Python3网络爬虫(一):利用urllib进行简单的网页抓取

     

  2. Python 3.x 中"HTTP Error 403: Forbidden"问题的解决方案

你可能感兴趣的:(python)