初体验-Python爬虫网络收集(一)

前言

Python语言最近荣登最受欢迎语言之榜首,看来学习Python是目前相当明智的,对于Python的学习,Z(本人简称)我是举双手赞成的,甚至开始怂恿老婆和我一起学,由于Python语言的简洁易用,这里直接面对已经有编程基础的读者。

由于网络爬虫在Python界的兴起,特别是在某乎上能看到很多大神的爬虫案例和教学,Z对爬虫的兴趣也被激发出来,目标暂时是想实现网络比价,比如飞机票、某宝商品的比价,和信息搜集,类似定制版的百度。说实话,如果你想以较少的预先投入获取较高的回报,网络数据采集肯定是一个值得踏入的神奇领域。

Z写这里,主要是自己学习过程,好记性不如烂笔头,熟才能生巧;其次,好东西要给大家分享了才叫好东西。

话不多说,开始!

网络连接

平时大家上网都是,打开浏览器,输入google网址,然后就能看到浏览器发送过来的谷歌的主页信息,这里大部分的操作几乎都被计算机暗中执行了,然而我们学习网络数据采集,就必须要冲破一些接口的遮挡,不仅仅在浏览器层,有时候也包含网络连接层。

我们由简入难,从网络的 GET 请求开始,看对于 pythonscraping 网站,我们是如何获取数据,这里看 Python 的实现:

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

Z这里用的是 UbuntuOS,所以上面的代码以 test.py 名称保存本地,然后在终端输入:

$python3 scrapetest.py

注意,本地系统要安装 python3.x 才能执行,然后在终端能够看到网页的全部HTML源代码,这里的 urllib 库是 python 的标准库,我们会大量的用到这个库,所以可以去阅读这个库的 Python 文档(文档点这里)。

BeautifulSoup介绍

这个库很智能,它能通过定位 HTML 标签来格式化和组织复杂的网络信息,以对象的形式给我们展示 XML 结构信息。

由于 BeautifulSoup 库不是 Python 的标准库,需要单独安装,Ubuntu 的安装过程:

$sudo apt-get install python-bs4

安装成功在终端测试一下:

$python3
>>> from bs4 import BeautifulSoup

如果不报错就是可以了。

回到上面的栗子,现在Z想要获取标题的 H1 标签的内容,Python代码:

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

如果不出问题(Z在过程中就发现了网络端口连接错误,ping 不出那个网址),就得到如下的结果:

<h1>An Interesting Title</h1>

保证爬虫的可靠性

网络是很复杂的,有很多的突发情况,采集数据最怕的是兴冲冲写好了爬虫,运行,去睡觉,第二天一看,运行开始就报异常终止了,所以Z写代码,一定要多考虑爬虫可能会遇到的各种突发异常。

我们一行一行的来,看第一行,网址的获取,可能出现的是网页不存在、服务器不存在,简单,用try包住:

try:
    html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
    print(e)
    # 返回空值,中断程序,或者执行另一个方案
else:
    # 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),
    # 那么就不需要使用else语句了,这段代码也不会执行

如果上面出问题,会返回 None 值,html 这个对象就要做判断了:

if html is None:
    print("URL is not found")
else:
    # 程序继续

然后看后面,如果标签找不到,不存在,bsObj 就是 None,也会报错,报错如下:

AttributeError: 'NoneType' object has no attribute 'someTag'

所以上面的初体验代码可以改一下:

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTitle(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        return None
    try:
        bsObj = BeautifulSoup(html.read())
        title = bsObj.body.h1
    except AttributeError as e:
        return None
    return title

title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
    print("Title could not be found")
else:
    print(title)

总结上述,写爬虫,重要的是代码的格局,可以慢慢从简单的布局开始尝试,有问题,就改,然后改到一定程度,可以重新构思代码的布局,这个构思的过程才是我们最宝贵的经验!!!

万事开头难,初体验终于加班写好,待Z继续学习,分享给大家吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值