zoukankan      html  css  js  c++  java
  • 网络爬虫(二)

    上一节保存心急了,附上Linux的安装;

    docker官方版安装:curl -sSL http://get.docker.com/ | sh

    阿里云版安装:curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

    DaoCloud的安装脚本:curl -sSL http://get.daocloud.io/docker.com/ | sh

    三选一

    了解爬虫基础:HTTP和HTTPS

    HTTP是叫超文本传输协议,目前使用http1.1版本。HTTPS是以安全为目标的HTTP通道,简单来讲就是HTTP的安全版本。就是在HTTP下假如ssl层,简称HTTPS。

    HTTPS的安全基础是SSL,因此通过传输的内容都是SSL加密的,作用有如下两种。

    1,建立一个安全的信息通道保证数据的安全

    2,确认网站的真实性,凡是使用了HTTPS的网站,都有网站认证。

     但是有一点的情况下:有些HTTPS没有被CA机构信任,是自行签发的。爬取这样的站点,就需要忽略证书的选项,否则会提示SSL链接错误。

    上面的两张图就是浏览器在搜索时开发者F12你能看到的种种信息。

    当然在做爬虫的过程之中,经常会遇到这种情况,最初爬虫能够正常运行,正常抓取数据,但是一会就会提示403错误,其实打开网页一看,“您的IP频率太高”。

    这种情况是因为网站做出来反爬虫措施。服务器会检测某个IP在单位时间的请求次数,如果超过了这个阈值,就会直接拒绝服务。返回一些错误信息,这种情况称之为封IP。

    那就接下来使用代理:

    使用网上的免费代理

    使用付费代理

    亦或者使用ADSL拨号:拨一次号换一个IP,稳定性还高。

    下面正式介绍爬虫的使用:

    基本库的使用:urllib

    网上很多介绍urllib使用的方法已经不管用了。因为python3中已经不存在urllib2这个库了,统一为urllib了,引用的时候切记要注意 了。

    urllib模块呢分为4个内容:①request,他是最基本的HTTP的请求模块,可以用来模拟发送请求。就像在浏览器中输入网址并且回车一样,现在只需要给库传网址和必要的参数就可以模拟实现这个过程。

    ②error:这个是一个异常处理的模块,如果出现请求错误,我们便可以捕获异常。然后进行其他操作。

    ③parse:一个工具模块,提供了多种url的处理方法,比如说拆分解析合并等。

    ④robotparser:主要是用来识别网站的robots.txt文件,判断哪些网站可以爬,哪些网站不可爬取,用的相当少

    import urllib.request
    response = urllib.request.urlopen("http://www.baidu.com")
    html = response.read()
    print(html)

    情调一点:

    import urllib.request这个是python3的引入。
    下面的具体的用法:
    1,URLopen()
    urllib.request 模块提供最基本的狗仔HTTP请求方法,利用他可以模拟浏览器的一个请求的发起过程,同时他还有处理授权验证(authenticaton)、重定向(redirection)、浏览器Cookies以及其他的内容
    下面举个栗子看下强大之处:
    虽然以上上图中仅仅三行代码:就完成python的官网抓取,输出了网页的源代码。得到源代码之后呢,我们需要的链接、图片地址、文本信息不就可以提取出来了吗?
    1 import urllib.request
    2 response = urllib.request.urlopen("http://www.python.org")
    3 print(type(response))
    4 
    5 
    6 >>><class 'http.client.HTTPResponse'>
    View Code

    可以发现,他是一个HTTPResponse类型的对象,主要包含read()、readinto()、getheader(name)、……等属性。

    得到这个对象之后,我们把它赋值为response变量,然后就可以调用这些方法和属性,得到返回结果的一系列信息了。

    例如:调用send()方法可以得到网页的内容,调用status属性可以得到返回结果的状态码,如果是200代表成功,404代表网页未找到

    可见,前连个输出分别输出了响应的状态码和响应的头信息,最后一个输出通过调用getheader()方法并且传递一个参数Server获取了响应头中的Server值,结果是nginx,意思是服务器是采用nginx搭建的
    利用最为基本的urlopen()就可以完成最简单GET的抓取。
    假如我要传入一些参数呢?
    我们来看一下源码:
    def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                *, cafile=None, capath=None, cadefault=False, context=None):

    除了第一个参数是url之外,比如说data(附加数据),timeout(超时时间)等。

    data参数是可选的,如果需要添加参数,并且他是字节流编码格式的内容,也就是bytes()类型,需要通过bytes()方法转化,另外传递了这个参数,那么他的请求方法就不在是GET方式,而是POST方式

    下面是实例:

    import urllib.request
    import urllib.parse
    data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf-8')  # parse是用来处理URL,比如拆分和解析、合并等
    response = urllib.request.urlopen("http://httpbin.org/post", data=data)
    print(type(response))
    print(response.read())

    得到结果是:

    我们传递的参数出现在form字段中,说明了模拟了表单的提交方式,并且以POST方式传递数据。

    timeout参数

    假如我想现在给上面的代码加一个timeout的参数:

    import urllib.request
    response = urllib.request.urlopen("http://httpbin.org/post", timeout=1)
    print(type(response))
    print(response.read())

    得到的结果是什么?

    因为现在

    我们设置的超时时间1s,当程序运行1s之后服务器依旧没有响应,于是抛出异常,该异常属于urllib.error模块,错误原因就是超时。

    因此可以设置一个超时时间来控制一个网页如果长时间没有响应,就直接跳过他的抓取,这个可以使用try……except来进行捕获异常,代码如下:

    import urllib.request
    import urllib.error
    import socket
    try:
        response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.1)
    except urllib.error.URLError as e:
        if isinstance(e.reason, socket.timeout):
            print("你已超时")

    这里是请求了 http://httpvin.org/get测试连接,设置超时时间为0.1s,然后捕获了URLerror异常,接着判断异常是否属于,socke.timeout类型,打印结果。

    其他参数:

    除了data参数和timeout参数之外还有context参数,他必须是ssl.SSLContext类型,用来指定SSL设置。

    此外cafile和capath两个参数分别制定CA证书以及他的路径,这个在请求HTTPS连接的时候有用的,cadefault参数目前已经废弃了,,默认值为false。

    前面讲到了URLopen()的方法以及一些参数的使用,,其他的事情就交给官方文档吧。

    没有过不去的坎,只有没加够的油!
  • 相关阅读:
    IntelliJ IDEA 使用svn教程
    尾递归
    斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
    斐波拉契数列的计算方法
    C#实现多线程的方式:Task——任务
    LINQ查询表达式详解(2)——查询表达式的转换
    LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
    完成异步委托的三种方式
    C#实现多线程的方式:使用Parallel类
    C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/9211503.html
Copyright © 2011-2022 走看看