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 字样, 得到如下一行:

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

        第三方库就是这么好用!

  • 相关阅读:
    MyBatis入门案例、增删改查
    Hibernate第三次测试错题解析
    HIbernate二级缓存
    Hibernate组件映射
    java 序列化
    圈复杂度(Cyclomatic Complexity)
    ASE加、解密
    异常Exception
    动态代理(jdk--cglib)
    java.lang.Class类
  • 原文地址:https://www.cnblogs.com/dongdongwq/p/5534826.html
Copyright © 2011-2022 走看看