zoukankan      html  css  js  c++  java
  • python3网络爬虫笔记

    参考资料

    代码实现(一): 用Python抓取指定页面

    1 #!/usr/bin/env python
    2 #encoding:UTF-8
    3 import urllib.request
    4  
    5 url = "http://www.baidu.com"
    6 data = urllib.request.urlopen(url).read()
    7 data = data.decode('UTF-8')
    8 print(data)

          urllib.request是一个库, 隶属urllib. 点此打开官方相关文档. 官方文档应该怎么使用呢? 首先点刚刚提到的这个链接进去的页面有urllib的几个子库, 我们暂时用到了request, 所以我们先看urllib.request部分. 首先看到的是一句话介绍这个库是干什么用的:

          The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.

         然后把我们代码中用到的urlopen()函数部分阅读完.

         urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False)

          重点部分是返回值, 这个函数返回一个 http.client.HTTPResponse 对象, 这个对象又有各种方法, 比如我们用到的read()方法, 这些方法都可以根据官方文档的链接链过去. 根据官方文档所写, 我用控制台运行完毕上面这个程序后, 又继续运行如下代码, 以更熟悉这些乱七八糟的方法是干什么的。

    >>> import urllib.request
    >>> a = urllib.request.urlopen('http://10.54.0.2/OAapp/WebObjects/OAapp.woa')
    >>> type(a)
    <class 'http.client.HTTPResponse'>
    >>> a.geturl()
    'http://10.54.0.2/OAapp/WebObjects/OAapp.woa'
    >>> a.info()
    <http.client.HTTPMessage object at 0x7f390a3d4780>
    >>> a.getcode()
    200

     如果要抓取百度上面搜索关键词为Jecvay Notes的网页, 则代码如下

     1 #!/usr/bin/env python
     2 #encoding:UTF-8
     3 import urllib
     4 import urllib.request
     5 
     6 data={}
     7 data['word']='Jecvay Notes'
     8 
     9 url_values=urllib.parse.urlencode(data)
    10 url="http://www.baidu.com/s?"
    11 full_url=url+url_values
    12 
    13 data=urllib.request.urlopen(full_url).read()
    14 data=data.decode('UTF-8')
    15 print(data)

          data是一个字典, 然后通过urllib.parse.urlencode()来将data转换为 'word=Jecvay+Notes'的字符串, 最后和url合并为full_url, 其余和上面那个最简单的例子相同. 关于urlencode(), 同样通过官方文档学习一下他是干什么的. 通过查看

    1. urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
    2. urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)

         大概知道他是把一个通俗的字符串, 转化为url格式的字符串。

    Python的队列

         在爬虫程序中, 用到了广度优先搜索(BFS)算法. 这个算法用到的数据结构就是队列.

          Python的List功能已经足够完成队列的功能, 可以用 append() 来向队尾添加元素, 可以用类似数组的方式来获取队首元素, 可以用 pop(0) 来弹出队首元素. 但是List用来完成队列功能其实是低效率的, 因为List在队首使用 pop(0) 和 insert() 都是效率比较低的, Python官方建议使用collection.deque来高效的完成队列任务.

     1 #!/usr/bin/env python
     2 #encoding:UTF-8
     3 from collections import deque
     4 queue = deque(["Eric", "John", "Michael"])
     5 queue.append("Terry")           # Terry 入队
     6 print(queue)
     7 queue.append("Graham")          # Graham 入队
     8 print(queue)
     9 queue.popleft()                 # 队首元素出队
    10 print(queue)
    11 #输出: 'Eric'
    12 queue.popleft()                 # 队首元素出队
    13 #输出: 'John'
    14 print(queue)                    # 队列中剩下的元素

    Python的集合

          在爬虫程序中, 为了不重复爬那些已经爬过的网站, 我们需要把爬过的页面的url放进集合中, 在每一次要爬某一个url之前, 先看看集合里面是否已经存在. 如果已经存在, 我们就跳过这个url; 如果不存在, 我们先把url放入集合中, 然后再去爬这个页面。

          Python提供了set这种数据结构. set是一种无序的, 不包含重复元素的结构. 一般用来测试是否已经包含了某元素, 或者用来对众多元素们去重. 与数学中的集合论同样, 他支持的运算有交, 并, 差, 对称差.

    创建一个set可以用 set() 函数或者花括号 {} . 但是创建一个空集是不能使用一个花括号的, 只能用 set() 函数. 因为一个空的花括号创建的是一个字典数据结构. 以下同样是Python官网提供的示例。

     1 >>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
     2 >>> print(basket)                      # 这里演示的是去重功能
     3 {'orange', 'banana', 'pear', 'apple'}
     4 >>> 'orange' in basket                 # 快速判断元素是否在集合内
     5 True
     6 >>> 'crabgrass' in basket
     7 False
     8  
     9 >>> # 下面展示两个集合间的运算.
    10 ...
    11 >>> a = set('abracadabra')
    12 >>> b = set('alacazam')
    13 >>> a                                  
    14 {'a', 'r', 'b', 'c', 'd'}
    15 >>> a - b                              # 集合a中包含元素
    16 {'r', 'd', 'b'}
    17 >>> a | b                              # 集合a或b中包含的所有元素
    18 {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
    19 >>> a & b                              # 集合a和b中都包含了的元素
    20 {'a', 'c'}
    21 >>> a ^ b                              # 不同时包含于a和b的元素
    22 {'r', 'd', 'b', 'm', 'z', 'l'}

        其实我们只是用到其中的快速判断元素是否在集合内的功能, 以及集合的并运算。

    Requests Module

    Requests 是 Python 界大名鼎鼎的一个网络库, 其设计哲学是为人类而设计, 所以他提供的功能都非常的人性化. 他的方便对我而言主要有两大点:

    • 对 GET 和 POST 方法的封装做的很好, 自动处理了编码等问题;
    • 默认开启了 Cookies 处理, 在处理需要登录的问题上面非常方便.

    Requests 的方便之处不止这两点, 还提供了诸如标准登录接口之类的功能, 我们暂时用不上.

    总而言之, 对于使用过 urllib 的我们来说, 用 requests 会感觉我们之前生活在石器时代. 第三方库的强大就在于这里, 这也是 Python 这么火的重要原因.

    BeautifulSoup Module

    BeautifulSoup 大大方便了我们对抓取的 HTML 数据的解析, 可以用tag, class, id来定位我们想要的东西, 可以直接提取出正文信息, 可以全文搜索, 同样也支持正则表达式, 相当给力.

    小试牛刀

    我们随便抓取一个页面, 然后用 soup 来解析一下试试他的威力:

          我们十分轻松的获得了全文内容以及所有链接.

    重访知乎

         在上一篇文章中, 我尝试使用 urllib 和 re 获取了知乎登录页面的 _xsrf 参数, 这次我们通过这两个新的模块再试一次.

    打开浏览器隐身模式, 打开知乎网, 来到登录界面, 查看源代码, 搜索 xsrf 字样, 得到如下一行:

        于是我们只要两行代码就能搞定:

        第三方库就是这么好用!

  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/dongdongwq/p/5534826.html
Copyright © 2011-2022 走看看