两个微型的函数例子

hello小伙伴们大家好,还记得昨天的函数参数的文章吗?你get到了多少呢?实际的工作中并没有那么复杂,一个通用的函数定义形如:

def func_name(*args, **kwargs):
    pass

这样一个函数基本上就可以通吃了。之所以介绍那么多,就是让大家多了解一点,没有别的意思。

今天主要给大家介绍一个库的基本使用,那就是标准库urllib。在Python2.x中,是urllib2库,在Python3.x中,urllib2库被重命名为urllib,并且被分割成了几个子模块:urllib.request,urllib.parse,urllib.error。

urllib是python的标准库,我们不需要安装额外的库就可以使用它。它包含了很多方法,用来请求数据、处理cookies,甚至是改变元数据,如headers或用户客户端。

urlopen被用来打开远程网络上的一个对象并读取它,它可以用来读取HTML文件,图片文件或其他文件流。

urllib简单使用:

In[1]: from urllib.request import urlopen

In[2]: html = urlopen("http://pythonscraping.com/pages/page1.html")

In[3]: print(html.read()) 
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'

接下来写一个简单的函数,以复习昨天学过的内容。下面的脚本主要是爬取一个网页,获取该网页的title,非常的简单,简单到令人发指。代码如下:

# -*- coding: utf-8 -*-

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
# 如果没有安装bs4,请先安装之
# sudo pip install bs4


def get_title(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        print(e)
        return None
    
    try:
        bs_obj = BeautifulSoup(html.read(), 'html.parser')
        title = bs_obj.body.h1.text
    except AttributeError as e:
        return None
    
    return title

url = 'http://lavenliu.cn/post/test01.html'
title = get_title(url)
if title is None:
    print('Title could not be found')
else:
    print(title)

该脚本涉及到了两个模块:

  • urllib(标准模块)
  • bs4(第三方模块,需要安装)

接下来一个例子是查询IP地址的归属地信息,代码如下:

# -*- coding: utf-8 -*-

import sys
import argparse
import json
from urllib.request import urlopen

parser = argparse.ArgumentParser()
parser.add_argument('--ip-list-file', '-f',
                    action='store',
                    dest='ip_list_file',
                    help='file contains ip(s) which one ip per line to query')
parser.add_argument('--ip', '-i',
                    action='store',
                    dest='ip',
                    help='single ip to query')
results = parser.parse_args()

if len(sys.argv) < 2:
    print('You must enter at least one ip in cmd-line!')
    print('Usage: {} ip | ip_list_file'.format(sys.argv[0]))
    print('eg: {} --ip aaa.bbb.ccc.ddd | -f iplist'.format(sys.argv[0]))
    sys.exit(1)


def get_country(ip_address):
    url = 'http://freegeoip.net/json/'
    resp_json = urlopen(url+ip_address).read().decode('utf-8')
    resp_dict = json.loads(resp_json)
    
    if resp_dict['region_name'] and resp_dict['city']:
        return "[{}]: {}-{}-{}".format(
            resp_dict['ip'],
            resp_dict['country_name'],
            resp_dict['region_name'],
            resp_dict['city'])
    else:
        return "[{}]: {}".format(resp_dict['ip'], resp_dict['country_name'])


if results.ip_list_file:
    try:
        with open(results.ip_list_file) as f:
            ip_addresses = f.readlines()
        for ip_address in ip_addresses:
            print(get_country(ip_address.strip()))
    except FileNotFoundError:
        print('No such file: {}'.format(results.ip_list_file))
    except PermissionError:
        print('Permission denied: {}'.format(results.ip_list_file))
else:
    print(get_country(results.ip))

该脚本需要接收一个参数,要么是传入一个单个的IP地址,要么传入一个包含很多IP地址文件。该脚本的运行结果为:

$ python3 getip.py --ip-list-file iplist
[101.81.26.144]: China-Shanghai-Shanghai
[110.110.53.112]: China-Beijing-Beijing
[111.10.118.221]: China-Chongqing-Chongqin
[111.128.107.62]: China-Beijing-Beijing
[111.128.111.60]: China-Beijing-Beijing
[111.13.44.158]: China
...
[111.20.163.186]: China-Shaanxi-Xi'an
[111.41.44.23]: China-Heilongjiang-Jixi
[111.47.8.170]: China-Hubei-Chengzhong

ip文件内容为:

$ cat iplist
101.81.26.144
110.110.53.112
111.10.118.221
111.11.227.76
111.12.251.10
111.12.251.11
111.128.107.62
111.128.111.60
111.13.44.158
111.14.199.105
111.14.237.193
111.143.204.96
111.14.40.137
111.14.50.80
111.145.1.177
111.145.199.6
111.19.59.123
111.20.129.238
111.20.163.186
111.22.5.206
111.26.219.65
111.27.142.188
111.30.115.35
111.35.58.2
111.37.9.133
111.37.9.150
111.37.9.168
111.37.9.189
111.40.10.19
111.40.10.4
111.40.64.229
111.40.67.139
111.41.44.23
111.43.217.76
111.47.8.170
111.63.44.51
111.7.130.133
111.7.130.176
111.7.130.201
111.7.131.57
111.7.131.84
111.7.131.89

如果传入一个单个的IP地址呢?演示如下:

$ python3 getip.py --ip 58.246.245.18
[58.246.245.18]: China-Shanghai-Shanghai

这里用到了一些模块,这里我们并不打算介绍模块的具体使用方法,大家可以依葫芦画瓢,或者查看帮助手册,完全可以自学。

原文发布于微信公众号 - 小白的技术客栈(XBDJSKZ)

原文发表时间:2017-11-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王大锤

理解消息转发机制

1783
来自专栏程序员宝库

最快的 Python Web 框架入门

环境:python3.5+ python -m pip install sanic

824

在Atom中设置Python开发环境

当然,网络上有很多很棒的文本编辑器。Sublime Text,Bracket,Atom等。就我个人而言,我一直都是Atom的粉丝,因为它是完全免费的,并且它有...

3558
来自专栏时序数据库专栏

Elasticsearch集群Shard Allocation机制

    Elasticsearch由一些Elasticsearch进程(Node)组成集群,用来存放索引(Index)。为了存放数据量很大的索引,Elastic...

550
来自专栏Albert陈凯

Spark详解07广播变量BroadcastBroadcast

Broadcast 顾名思义,broadcast 就是将数据从一个节点发送到其他各个节点上去。这样的场景很多,比如 driver 上有一张表,其他节点上运行的 ...

3296
来自专栏河湾欢儿的专栏

sass

我们大家都知道html、css不属于编程语言属于标记语言,所以很难像js一样定义变量、编写方法实现模块化,而目前的css编写模式中都是定义一些公共样式类名,那一...

701
来自专栏葡萄城控件技术团队

ActiveReports 报表应用教程 (8)---交互式报表之动态过滤

用户可以使用葡萄城ActiveReports报表参数 (Parameters)集合把数据提供给报表中的文本框或图表,也可以选择数据的一个子集显示到报表的特定区域...

1588
来自专栏酷玩时刻

微信公众号开发之推广支持

前几篇文章详细介绍了微信App支付、公众号支付、微信红包、微信刷卡以及支付宝支付,今天来聊聊 推广支持之生成带参数的二维码、长链接转短链接

693
来自专栏Python中文社区

简陋的分布式爬虫(附项目代码地址)

專 欄 ❈ 哇咔咔,学习过C, C++, Python, 了解java,html, javascript基础。其中就Python而言,自己写过简单的博客(注册,...

19310
来自专栏C++

python笔记:#014#综合应用

1357

扫描关注云+社区