美文网首页思科DevNet
Python网络爬虫(由简入深)

Python网络爬虫(由简入深)

作者: dvlproad | 来源:发表于2018-12-14 16:26 被阅读11次

    本文章包含内容

    一、Python必备基础认识
    二、Python编写的初步尝试(用Sublime Text编写)
    三、网络爬虫-使用Python和urllib、Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中
    四、结束语

    【附1:解决Sublime Text对Python的支持】
    【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】
    【附3:使用Beautiful Soup库来标准输出网页内容】
    【附4:正则表达式必备基础知识】
    【附5:Sublime Text的控制台输入】

    一、Python必备基础认识

    • 查看Python版本
      python --versionpython -V(大小的V)

    • 打开查看Mac系统自带Python2:
      open /System/Library/Frameworks/Python.framework/Versions

    • 打开查看自己安装的Python3:
      open /usr/local/Frameworks/Python.framework/Versions

    • 查看编译命令所在的位置
      which python3

    • 在cmd命令行里进入和退出Python程序

    • 进入:
      进入系统Python2:直接输入python即可;
      进入自装Python3:直接输入python3即可;
    • 退出:
      方法①:输入exit(),回车
      方法②:输入quit(),回车
      方法③:输入ctrl+z,回车

    二、Python编写的初步尝试(用Sublime Text编写)

    • 语法注意
    python2.x python3.x
    打印 print "Hello world" print ("Hello world")
    引入模块 import urllib2 import urllib.request
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    import importlib,sys
    importlib.reload(sys)
    输入 raw_input input
    • 导入模块

    设A为模块名,B为模块A中的某个类、方法或者变量等

    import A from A import B
    含义 导入整个模块A 导入A中的B
    调用A中的B A.B B
    • 测试Sublime Text对Python编写的支持
    测试Sublime Text对Python编写的支持.png

    另有【附1:解决Sublime Text对Python的支持】

    分割图1.jpg

    三、网络爬虫-使用Python和urllib、Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中

    本节包含内容如下:

    1、抓取数据的必备知识(获取及打印网页内容)
    2、使用BeautifulSoup库的必备知识
    3、使用Beautiful Soup库抓取网页数据,并输入想要的内容至plist文件中示例

    1、抓取数据的必备知识(获取及打印网页内容)

    以要抓取某个网站上的东西为例,

    #-*- coding:utf-8 -*-
    import urllib.request
    resp=urllib.request.urlopen('http://www.baidu.com')
    html=resp.read()
    print(html)
    

    一般为了能够让输出内容更加刻度,我们都会按照【附3:使用Beautiful Soup库来标准输出网页内容】进行操作。
    要使用Beautiful Soup库,请参照【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】进行安装。

    2、使用BeautifulSoup库的必备知识

    • ①、不能创建bs4.py的文件,会造成与系统冲突,同时在from bs4 import BeautifulSoup代码处报错
    • ②、soup = BeautifulSoup(html, 'html.parser')不要漏写解析器,要不然会有No parser was explicitly specified, so I'm using the best available HTML par警告
    • ③、更多问题可查看Beautiful Soup 4.4.0 官网文档

    3、使用Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中示例

    #-*- coding:utf-8 -*-
    import urllib.request
    from bs4 import BeautifulSoup
    
    import importlib,sys 
    importlib.reload(sys)
    
    # 函数
    def  printPlistCode():
        #1.得到这个网页的 html 代码 #
        html = urllib.request.urlopen("http://movie.douban.com/chart").read()
    
        #2.转换 一种格式,方便查找
        #soup = BeautifulSoup(html, 'html.parser')
        soup = BeautifulSoup(html,'lxml')
        print(soup.prettify())
        print(soup.title)
        print(soup.title.name)
        print(soup.title.string)
        print(soup.title.parent.name)
        print(soup.p)
        print(soup.p["class"])
        print(soup.a)
        print(soup.find_all('a'))
        print(soup.find(id='link3'))
        print("\n")
        print("\n")
        print("\n")
    
        #3.  得到 找到的所有 包含 a 属性是class = nbg 的代码块,数组
        liResutl = soup.findAll('a', attrs = {"class" : "nbg"})
        #4.用于拼接每个字典的字符串
        tmpDictM = ''
    
        #5. 遍历这个代码块  数组
        for li in liResutl:
    
            #5.1 找到 img 标签的代码块 数组
            imageEntityArray = li.findAll('img')
    
            #5.2 得到每个image 标签
            for image in imageEntityArray:
                #5.3 得到src 这个属性的 value  后面也一样 类似 key value
                link = image.get('src')
                imageName = image.get('alt')
                #拼接 由于 py中 {} 是一种数据处理格式,类似占位符
                tmpDict = '''@{0}@\"name\" : @\"{1}\", @\"imageUrl\" : @\"{2}\"{3},'''
    
                tmpDict =  tmpDict.format('{',imageName,link,'}')
    
                tmpDictM = tmpDictM + tmpDict
    
        #6.去掉最后一个 , 
        tmpDictM = tmpDictM[0:len(tmpDictM) - 1] #为了能输出原生中文不要进行.encode('utf8')
    
    
        #7 拼接全部
        restultStr = '@[{0}];'.format(tmpDictM)
    
        print(restultStr)
    
    
    if __name__ == '__main__':
        printPlistCode()
    

    输出结果为


    抓取到的内容.png

    下面将其拷贝出来至Xcode,并写入plist文件中

    将抓取的内容写入plist文件的代码.png

    查看输出到该路径下的文件内容,如图所示:


    整理到plist文件中的内容.png

    至此,恭喜您已经完成抓取网页数据,并输入想要的内容至plist文件中。


    分割图1.jpg

    四、初探Python的requests模块

    import requests
    response=requests.get('https://api.github.com/events')
    print(response.text)
    

    其他各种请求方式:常用的就是requests.get()和requests.post()
    import requests
    response1 = requests.get('https://api.github.com/events')
    response2 = requests.post('http://httpbin.org/post', data = {'key':'value'})
    response3 = requests.put('http://httpbin.org/put', data = {'key':'value'})
    response4 = requests.delete('http://httpbin.org/delete')
    response5 = requests.head('http://httpbin.org/get')
    response6 = requests.options('http://httpbin.org/get')

    五、结束语

    感谢您的细心查阅,如有不足,还请指教。

    【附1:解决Sublime Text对Python的支持】
    【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】
    【附3:使用Beautiful Soup库来标准输出网页内容】
    【附4:正则表达式必备基础知识】
    【附5:Sublime Text的控制台输入】

    【附1:解决Sublime Text对Python的支持】

    Sublime的.sublime-build文件的位置:~/Library/Application Support/Sublime Text 3/Packages/User

    • 解决Sublime Text对Python的支持
    解决Sublime Text对Python的支持.png

    【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】

    Mac上装python的pip安装包时,显示-bash: pip: command not found的解决办法

    命令①、curl 'https://bootstrap.pypa.io/get-pip.py' > get-pip.py
    命令②、sudo python get-pip.py
    
    使用python的pip安装Beautiful Soup库.png

    【附3:使用Beautiful Soup库来标准输出网页内容】

    执行如下代码即可

    import urllib.request
    from bs4 import BeautifulSoup
    
    html = urllib.request.urlopen("http://movie.douban.com/chart").read()
    
    soup = BeautifulSoup(html,'lxml')
    print(soup.prettify())
    print(soup.title)
    print(soup.title.name)
    print(soup.title.string)
    print(soup.title.parent.name)
    print(soup.p)
    print(soup.p["class"])
    print(soup.a)
    print(soup.find_all('a'))
    print(soup.find(id='link3'))
    

    【附4:正则表达式必备基础知识】

    常用正则表达式语法

    特殊字符 描述
    * 匹配前面的子表达式零次或多次。
    + 匹配前面的子表达式一次或多次。
    ? 匹配前面的子表达式零次或一次。(必须跟在*或者+后边用)
    . 匹配除换行符 \n 之外的任何单字符

    因为.相当于除换行符 \n 之外的任何单字符

    • 二符(贪婪匹配,即匹配尽可能多的字符。因为已经尽可能多了,所以结果至多只有一个。):
    以ab为例 以aabaabab为例
    .* 尽可能多,哪怕匹配结果是零次除换行符 \n 之外的任何单字符的也算匹配成功。
    .+ 尽可能多,只要匹配结果是没达到至少一次除换行符 \n 之外的任何单字符,就算没匹配成功
    a.*b 它将匹配最长的以a开始,以b结束的字符串。 它将会匹配到整个字符串ab 它将会匹配到整个字符串aabab
    a.+b 它将匹配最长的以a开始,以b结束,且开头和结束之间是不能没有其他字符的字符串。 它将没有匹配 它将会匹配到整个字符串aabab
    • 三符(懒惰匹配,即匹配尽可能少的字符。因为已经尽可能少了,所以结果一般都有多个。所以如果成功匹配到一个后,其会继续寻找下一个,直至结束):
    以ab为例 以aabaabab为例,会匹配到
    .*? 尽可能少,哪怕匹配结果是零次除换行符 \n 之外的任何单字符的也算匹配成功 我是来占位的。我是来占位的,我是来占位的。我是来占位的,我是来占位的
    .+? 尽可能少,只要匹配结果是没达到至少一次除换行符 \n 之外的任何单字符,就算没匹配成功。
    a.*?b 它将匹配最短的以a开始,以b结束的字符串 它将会匹配到整个字符串ab aab(第一到第三个字符)
    aab(第四到第六个字符)
    ab(第七到第八个字符)
    a.+?b 它将匹配最短的以a开始,以b结束,且开头和结束之间是不能没有其他字符的字符串。 它将没有匹配 aab(第一到第三个字符)
    aab(第四到第六个字符)

    实际可能举例及注意:

    以"orderId":"aabaabab"为例 注意
    ".*?" "orderId"
    "aabaabab"
    "(.*?)" "orderId"
    "aabaabab"
    ()是标记一个子表达式的开始和结束位置
    "orderId":".*?" "orderId":"aabaabab"
    "orderId":"(.*?)" "orderId":"aabaabab" ()是标记一个子表达式的开始和结束位置。
    "orderId":"\(.*?\)" 没有匹配 \(相当于检测括号

    附:如果你想验证你的正则表达式是否正确的话,可以在在线正则表达式测试上验证。

    举例:

    正则表达式
    a.b 可以匹配这些字符串:acb、aeb、a b,但是不匹配aoob。
    a.*?xxx 可以匹配 abxxx axxxxx abbbbbxxx

    【附5:Sublime Text的控制台输入】

    编译运行的时候为tools->build,即我们常用的快捷键Ctrl+B。这之后底下会出现控制台。但是这个在控制台中只能输出不能输入。
    想要在Sublime Text的"控制台"实现输入,如有时候我们需要输入密码,则我们需要安装SublimeREPL插件。
    安装SublimeREPL步骤:Ctrl+shift+p 键入 install packages,再继续键入 SublimeREPL 安装即可。
    安装SublimeREPL完后,以后的编译运行的操作当你改为:tools->sublimeREPL->python->python-Run current file的时候,其就会出现新的页面REPL[python],作为新的控制台,可以输入输出互动。
    如还不清楚,可查看sublime运行python程序的控制台输入

    相关文章

      网友评论

        本文标题:Python网络爬虫(由简入深)

        本文链接:https://www.haomeiwen.com/subject/bgtbhqtx.html