python的学习之路三

On the learning of Python

python

在第一篇的时候,我就提过,python真正厉害的地方在于它的库,pytohn的库十分的多,库里各式各样的函数为我们提供了很多的方便。当你学会了python的基础语法,剩下来的就是你要去了解你所需要用到的那些库。其实库,就是python里面的模块。

0x01 库/模块

什么是模块(库)?模块是更高级的封装,模块其实就是程序,把程序封装起来,需要用到了就拿出来,那句话怎么说?多快好省~

import 模块名
from 模块名 import 函数名
import 模块吗 as 新名字

0x02 常用模块

1.网络请求库(HTTP请求):

requests
urllib
urllib2
httplib

其实我记得好多,但是想不起来了。

下面的爬虫都是基于python3.x,但是python2.x也可以用,只不过来回切换版本的时候容易出现因为版本差异的报错,比较恶心的。

这里以requests库为例(其实也是我第一个爬虫):

#在写爬虫之前,要仔细的阅读要爬取页面的代码以及标签对,找到所需的,再在自己的程序里面定义,然后再对照源代码写程序

import requests
import time
import bs4
#导入了三个模块

#定义了一个获取页面html内容的函数
def get_html(url):
    try:#检查下面的代码段是否有错误,如果有执行except后面的语句
        r = requests.get(url, timeout = 30)
        #如果网页的状态码不是200,就会抛出异常
        r.raise_for_status()
        #r.encoding = r.apparent_encoding
        r.encoding = 'utf-8'#设置了跟抓取页面相同的字符集
        return r.text #返回一个文本文档
    except:
        return "ERROR"

#定义了一个获取内容的函数
def get_content(url):
    comments = []   
    html = get_html(url) #用html接受了get_html(url)传过来的一个文本文档

    soup = bs4.BeautifulSoup(html, 'lxml') #以lxml的格式将html赋给soup

    #在这里用find_all查找出所有class标签等于指定值的li标签对,并赋值给liTags
    liTags = soup.find_all('li', attrs={'class':' j_thread_list clearfix'})

    #使用for循环,遍历出来liTags里面的内容,并重新定义一个comment字典用来接受数据
    for li in liTags:
        comment = {}
        try:#检测函数的try,跟上面的try用法一样

            #给comment里的键值对赋值,strip 同时去掉左右两边的空格,lstrip 去掉左边的空格,rstrip 去掉右边的空格。赋值的内容,经过find的查找以及筛选
            comment['title'] = li.find('a', attrs = {'class': 'j_th_tit'}).text.strip()
            #效果同上,只不过在值前加上了一个固定的字符串内容,+ 在这里表示连接符
            comment['link'] = "http://tieba.baidu.com" + li.find('a', attrs={'class': 'j_th_tit'})['href']
            comment['name'] = li.find('span', attrs={'class': 'tb_icon_author '}).text.strip()
            comment['time'] = li.find('span', attrs={'class': 'pull-right is_show_create_time'}).text.strip()
            comment['replyNum'] = li.find('span', attrs={'class': 'threadlist_rep_num center_text'}).text.strip()
            #把comment字典里的内容,添加到comments这个列表里
            comments.append(comment)
        except:
            print("出了点小问题")
    #返回comments这个列表
    return comments

#定义一个写入文件的函数,传入的参数是一个字典
def Out2File(dict):
    #会单独的解释这个with语句,他就是打开一个文件,模式可选,然后再关闭。a 以写入模式打开,如果文件存在,则在末尾追加写入。+ 可读写模式(可添加到其他模式中使用)
    with open('C://Users//10617//Desktop//TTBT.txt', 'a+') as f:

        #以for循环的方式打开dict
        for comment in dict:
            #f.write是将括号里的内容,写入文件,后面.format(),一一对应前面的{}
            f.write('标题: {} \t 链接: {} \t 发帖人: {} \t 发帖时间: {} \t 回复数量: {} \n'
                    .format(comment['title'],comment['link'], comment['name'],comment['time'],comment['replyNum']))
            print("当前页面爬去成功")
#定义一个基础函数,用来接受url以及要爬取的页数
def main(base_url, deep):
    url_list = []#定义了一个url列表
    for i in range(0, deep):#使用for循环,把url逐个添加到url_list中
        url_list.append(base_url + '&pn=' + str(50 * i))
    print('所有的网页已经下载到本地! 开始筛选信息。。。。')

    #使用for循环把所有的url从url_list中遍历出来
    for url in url_list:
        #调用之前定义的get_comment()去获取页面内容,并赋值给content
        content = get_content(url)
        #把content作为参数传入Out2File()函数中,写入文本
        Out2File(content)
    print('所有的信息都已经保存完毕!')
#base_url是定义好的url
base_url = 'http://tieba.baidu.com/f?ie=utf-8&kw=%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8&fr=search&red_tag=z0551200317'
#指定好要爬取的页数,不然太多会爬好久
deep = 3
#这里是重点。百度上说,当别的module(其实就是模块,这么说比较装13而已)引入的时候,__name__就是你的module名字,而不是__main__。其实我也不是很懂,碰到了再说。只需要知道,这样当你运行这段代码的时候,这整个流程就开始执行了。
if __name__ == '__main__':
    #调用main函数,并传入所需参数
    main(base_url, deep)

这个脚本我当时写的时候,还是一脸懵逼的,索性就直接每句都加上了注释,也方便自己之后的仿写。

再放上一个稍微简单些的:

import requests
r = requests.get("http://top.baidu.com/?fyb=PcReDianAla01", timeout=30)
r.raise_for_status()
r.encoding = 'utf-8'
print(r.text)

这样,就可以获取到那个页面的源代码了。

这里requests库用的比较多,就简单的说下requests库。
Request是一个简答优雅的python HTTP库,相较于python标准库中的urllib和urllib2的库,Requests更加的便于理解使用,在python官网还可以看到一段十分有趣的话:

警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。

虽然比较扯淡,但是还是足以看出requests库的方便之处。

安装:

pip install requests
python -m pip install requests
python3 -m pip install requests
其实只要第一行就可以了,但是我的电脑是py2和py3共存的,所以会有后面的两条命令的。

request库:官方文档

requests 库的七个常用方法:

import requests
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应HTTP的HEAD
requests.post() 向HTML网页提交post请求的方法,对应HTTP的POST
requests.put() 向HTML网页提交put请求的方法,对应HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应HTTP的PATCH
requests.delete() 向HTML网页提交删除请求,对应HTTP的DELETE


requests.get()
    #这个方法可以接收三个参数,其中第二个默认为None 第三个可选
    def get(url, params=None, **kwargs)
    #作用是模拟发起GET请求
    Sends a GET request.
    #模拟获取页面的url链接
    :param url: URL for the new :class:Request object. 
    #额外参数 字典或字节流格式,可选
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:Request. 
    # 十二个控制访问参数,比如可以自定义header
    :param **kwargs: Optional arguments that request takes. 
    # 返回一个Response对象
    :return: :class:Response <Response> object 
    :type: requests.Response

    **kwargs:
        kwargs: 控制访问的参数,均为可选项

        params : 字典或字节序列,作为参数增加到url中

        data : 字典、字节序列或文件对象,作为Request的内容 json : JSON格式的数据,作为Request的内容

        headers : 字典,HTTP定制头

        cookies : 字典或CookieJar,Request中的cookie

        auth : 元组,支持HTTP认证功能

        files : 字典类型,传输文件

        timeout : 设定超时时间,秒为单位   

        \proxies : 字典类型,设定访问代理服务器,可以增加登录认证

        allow_redirects : True/False,默认为True,重定向开关

        stream : True/False,默认为True,获取内容立即下载开关

        verify : True/False,默认为True,认证SSL证书开关

        cert : 本地SSL证书路径

        url: 拟更新页面的url链接

        data: 字典、字节序列或文件,Request的内容

        json: JSON格式的数据,Request的内容
        实例:
            import requests

            hd = {'User-agent':'123'}
            r = requests.get('http://www.baidu.com', headers=hd)
            print(r.request.headers)

            '''
            OUT:
            {'User-agent': '123', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive
            '}
            '''.

            import requests
            pxs = { 'http': 'http://user:pass@10.10.10.1:1234',
                    'https': 'https://10.10.10.1:4321' }#在访问时,设置一个代理服务器,通过代理服务器去访问。
            r = requests.get('http://www.baidu.com', proxies=pxs)
            print(r.requests)



                            import requests
            r = requests.get("http://www.baidu.com")

            '''
            Response(self)

            The :class:Response <Response> object, which contains a server's response to an HTTP request.

            '''
            #HTTP请求的返回状态,比如,200表示成功,404表示失败
            print (r.status_code)
            #HTTP请求中的headers
            print (r.headers)
            #从header中猜测的响应的内容编码方式 
            print (r.encoding)
            #从内容中分析的编码方式(慢)
            print (r.apparent_encoding)
            #响应内容的二进制形式
            print (r.content)

            实战:
                def getHtmlText(url):
                    try:
                        r = requests.get(url, timeout=30)
                        # 如果状态码不是200 则应发HTTOError异常
                        r.raise_for_status()
                        # 设置正确的编码方式
                        r.encoding = r.apparent_encoding
                        return r.text
                    except:
                        return "Something Wrong!

关于requests库,由于我不要经常写一些脚本,所以说的比较详细,回头不忙了,补上python-web的东西~

其实感觉这次写的没有什么头绪,因为最近实在是太忙了,所以也没来得及搞。感觉,我应该先介绍requests的库,再放上脚本的。

如果对你有帮助,记得打赏哦~


Reprint please specify: wh1te python的学习之路三

Previous
python的学习之路一 python的学习之路一
On the learning of Python pythonpython是一门非常厉害的语言,关于它的介绍,就不多说了,只要掌握了基础的语法,剩下的就是逐渐认识python的一些库,python的厉害之处就是有很多各种各样的库,把这些
2018-05-10
Next
python的学习之路二 python的学习之路二
On the learning of Python python上篇介绍了python的基础变量以及基本语法,本篇继续介绍常见的操作,也非常的实用。 0x01 基本规则Python语句中有一些基本规则和特殊字符: 井号 # 表示之后的Py
2018-05-10
TOC