第一章 你的第一个网络爬虫

注意:《Web Scraping with Python》的辅助材料(代码示例,习题等)可以在Github 中找到。

当你开始爬虫的时候,你就会感激浏览器为我们做的一切。一张网页,在没有HTML来规定格式,CSS来定型,JaveScript来执行的情况下,初次看起来是不堪入目的。在这一章,以及在下一章,我们会讲述如何在没有浏览器的帮助下格式化和解释数据。

连接(Connecting)

如果你对网络或者网络安全完全不了解,互联网技术似乎是非常神秘的。每次打开浏览器的时候,我们都不会去想网络是如何运行的,而是会直接进入http://google.com. 事实上,我惊讶于计算机接口已经先进到大多数用户在使用互联网的时候都不会想互联网是如何运行的。

然而,网络爬虫则要求剥离出这个接口的表层,不仅仅是在浏览器的层次(它如何诠释HTML, CSS以及JaveScript),而且是在网络连接层。

为了给你基础架构的思想, 我们先看看下面的例子。Alice拥有一个网络服务器;Bob拥有一个台式机,他正尝试与服务器相连。当一个机器想要与另外一个机器发送信息的时候,下面的事情会发生:

  1. Bob的电脑发送一条只有1和0的比特流,1和0表示线路的电压。这些比特形成一段信息,包含了头部(header)和数据(body)。头部包含了局部路由的MAC地址,目的地址是Alice的IP地址。数据包含了向Alice的服务器应用的请求。

  2. Bob的局部路由接收到这些1和0,把它们视为一个包,从Bob自己的MAC地址到Alice的IP地址。他的路由以原IP地址的形式标记了她自己的IP地址,通过网络发送它。

  3. Bob的包穿过几个中间服务器,每个服务器会指明它的包的正确的物理(链路)路径,最终到Alice的服务器。

  4. Alice的服务器接收到以它的IP地址为目的地的包。

  5. Alice的服务器读取了这个包头部的端口地址(对网页应用来说都是80,做个类比,这就像是这个包数据的“公寓号码”,而IP地址就像是街道地址),将它发给合适的应用。

  6. 网络应用服务器接收到服务器处理器的数据流,这个数据可以是(i)GET请求;(ii)index.html文件。

  7. 网络服务器定位正确的HTML文件,将它绑定到一个新的包,然后发送给Bob。

在这个交换的过程中,浏览器扮演者什么样的角色呢?绝对是无处不在的。实际上,浏览器是一个相对于互联网而言比较新的发明,在1990年Nexus第一次被发明出来。

网络浏览器是一个非常有用的应用,其构建了信息的包,发送他们,解释你所得到的图片,声音,视频,文本等等。然而,一个网络浏览器仅仅只是代码,代码能够被分离出基本的构建,然后重新写,使用,以及做成我们想要的东西。一个网络浏览器能够告诉处理器去发送数据给某个应用,这个应用能够处理无线接口,不仅如此,一些编程语言有专门的库莱做这些。

让我们来看看用Python来做这些:

from urllib.request import urlopen
html = urlopen("http://pythonscraping.com/pages/page1.html")
print(html.read())

你可以将这段代码保存为 scrapetest.py,然后在终端运行:

$python scrapetest.py

注意: 如果你在你的机器上已经安装了 Python 2.x,你需要明确地用Pyhton 3.x来运行这个命令:
$python3 scrapetest.py

这样就会输出上述链接的完整的HTML代码。更准确地说,它会输出HTML文件 page1.html,这个文件会在域名为 http://pythonscraping.com 的服务器的路径上 /pages 发现。

链接的网站为:

而之前的命令的结果是:

b'< html>\n< head>\n< title>A Useful Page</ title>\n</ head>\n< body>\n< h1>An Interesting Title</ h1>\n< div>\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n< /div>\n< /body>\n< /html>\n'

那么不同的地方呢?大多数现代的网页会有许多与它们链接的资源文件。这些文件可以是图像文件,JaveScript文件,CSS文件,或者其他一些与你正在请求的网页的所相连的内容。当一个网络浏览器点击一个标签,比如< img src=”cuteKitten.jpg”>, 浏览器知道她需要向服务器做另外一个请求,去获得文件 cuteKitten.jpg,从而能够反馈给用户完整的页面。注意到我们的Python脚本并没有退回的逻辑以及请求多个文件;它只能读取我们请求的单个的HTML文件。

所以,应该怎么做呢?由于Python与英语相通的本质,

from urllib.request import urlopen

意味着它看上去意味的那样:它看上去是Python模块请求安定仅仅调用函数urlopen

urllib 或者 urllib2?
如果你曾在Python 2.x 中使用urllib2库,你可能已经注意到urllib2和uhrllib之间好像有什么东西改变了。在Python 3.x中,urllib2重新命名为url lib且分为了几个模块: urllib.request, urllib.parse, 和 urllib.error。尽管函数名字大多数保持了相同,你应该注意到当使用新的urllib哪个模块已经被移为子模块。

urllib是一个标准的Python库(意味着你不需要安装一些其它的东西来于行之前的例子),包含了一些函数,这些函数是为了向网页请求数据,处理cookies, 甚至改变元数据比如头部和user agent等。我们会在本书中使用urllib,所以我们推荐你读库的Python文档(http://docs.python/org/3/library/urllib.html)。

python 3.6.0
url lib包含了几个用于处理URL的模块:

  • urllib.request 用于打开、读取URLs
  • urllib.error 包含urllib.request出现的异常
  • urllib.parse 解析 URLs
  • urllib.robotparser 解析 robots.txt 文件

urlopen用来打开一个网络中的异地项目,然后读区它。因为它是一个相对通用的库(它能读区HTML文件,图像文件,或者其他的文件流),我们会在本书中经常使用它。

更多相关文章

  1. 我使用生成html文件的python制作了一个脚本。如何使用Web爬网程
  2. 问一个高深的问题,静态html页面如何接收来自服务器的参数?
  3. j2ee的web项目,有最终的html代码(即f12看到的最终给用户浏览器展示
  4. 在新选项卡中打开下载的文件
  5. UpdateResource(增加、删除或替代某可执行文件中的资源)
  6. golang写服务端程序,作为文件上传与下载的服务器。配合HTML5以网
  7. HTML5新特性之文件和二进制数据的…
  8. 我正在尝试使用带有post方法的AJAX将用户名和密码发送到php文件
  9. 在Makefile.am中添加make install 的安装文件

随机推荐

  1. Python 爬取CSDN博客频道
  2. 谈网页游戏外挂之用python模拟游戏(热血
  3. 使用芹菜接收未注册的任务
  4. 【Python截图】截图处理
  5. 自学Python九 爬虫实战二(美图福利)
  6. ubuntu使用uwsgi+nginx部署django
  7. python学习笔记:python 2与python 3的一些
  8. 【python学习.油价和美元汇率查询】
  9. python---写一个迭代器
  10. 第七章、Python字符编码