精华内容
下载资源
问答
  • 150讲轻松学习Python网络爬虫

    万人学习 2019-05-16 15:30:54
    比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取...
  • 主要为大家详细介绍了python网络爬虫学习笔记的第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • python网络爬虫学习笔记

    千次阅读 多人点赞 2014-09-04 13:12:13
    python网络爬虫学习笔记 By 钟桓  9月 4 2014 更新日期:9月 4 2014 文章目录 1. 介绍:2. 从简单语句中开始:3. 传送数据给服务器4. HTTP头—描述数据的数据5. 异常 5.0.1. URLError5.0.2. ...

    python网络爬虫学习笔记

     9月 4 2014 更新日期:9月 4 2014

    文章目录
    1. 1. 介绍:
    2. 2. 从简单语句中开始:
    3. 3. 传送数据给服务器
    4. 4. HTTP头—描述数据的数据
    5. 5. 异常
      1. 5.0.1. URLError
      2. 5.0.2. HTTPError
      3. 5.0.3. 处理异常
      4. 5.0.4. info和geturl

    介绍:

    网络爬虫的名字很有意思,英文名称web spider。真得很形象,蜘蛛结网为了获取食物,而我们的爬虫程序,也是为了获取网络上的资源。这篇blog是本人学习过程中的记录。学习过程中,使用的语言是python2.7;python2.7有两个模块,urllib和urllib2,这两个模块提供了很好的网络访问的功能。下面会更好的体会。值得一提的时,在python3中,将urllib和urllib2这两个模块合为一个urllib。感兴趣的可以看这里

    urllib和urllib2是python中功能强大得网络工作库,它们让你的网络访问像文件访问一样(例如,文件访问我们要先open()一个文件,它的操作也是类似的,后面就会看到例子)。之所以能够这么方便,因为这些模块的内部很好的使用不同的网络协议来完成这些功能,(学过网络应该了解,访问一个网页这个简单的过程,其实涉及到很多的网络协议,像http,dns等等,而urllib和urllib2封装了这些协议,让我们不用和它们打交道,只需要调用这些模块的方法来完成我们需要的功能)。同时,这些模块也提供一些稍微更复杂一点的借口来处理一些情形,例如用户认证,cookies和代理等等。下面让我们开始来学习它们吧。


    从简单语句中开始:

    前面说过,使用两个模块,访问网页变得就会像访问文件一样方便。在一般情况下,urllib2访问会更好些(效率上更好,不过urllib还是需要使用,后面会介绍需要urllib做一些事情),所以下面我们来看看使用urllib2的最简单的例子。

    import urllib2;
    
    response = urllib2.urlopen("http://www.zhonghuan.info");
    html = response.read();
    print html;

    在终端下下输入命令行 python test.py > zhonghuan.html ,
    打开文件后显示的是我的个人blog首页的html代码:

    这是最简单的一个利用urllib2访问网页的例子,urllib2是根据URL中:前面的部分来判断是用什么协议访问的,例如,上面的例子我们用的时http,这里也可以换成ftp:,file:,等。。。我们可以不用去了解它内部是如何封装这些网络协议的。

    urllib2中可以用一个镜像对象(Request Object)来表示我们http访问,它标示你想要访问的URL地址,我们来看一下下面的例子。

    import urllib2
    
    req = urllib2.Request('http://www.zhonghuan.info')
    response = urllib2.urlopen(req)
    the_page = response.read()
    print(the_page)


    req变量就是一个Request对象。它确切的标示了你要访问的URL地址。(这里是http://www.zhonghuan.info);对于其它的形式的访问,例如ftp和file,形式也是类似的,具体可以看[这里][2];

    其实,Request对象还能做两个额外的事情。

    1. 你可以发送数据给服务器。
    2. 你可以发送一些额外的信息(又叫元数据,描述数据的数据。一些语言里面的元类是生成类的类,如python就在这些语言中;所以元数据,顾名思义,描述数据的数据,那么这些被描述的数据是什么呢?上面中,还有request对象的一些信息,而这些描述被放在http头部发送出去了。有关http header,可以看这里);

    传送数据给服务器

    有时候,你需要发送数据给服务器,这个地址是URL表示的,通常呢,这个地址的指向是CGI(Common Gateway Interface)脚本或者是其它一些网络应用。(关于CGI脚本,可以看这里,简单的说就是处理上传数据的脚本程序)。在HTTP访问中,通常使用哪个POST方式将数据发送出去,就好像你填完了html中得表单,你需要把表单中得数据发送出去,通常这里使用post请求。当然,post使用还有其它的情况,不单单指的是表单这一种情况。

    让我们先看下面的代码:

    import urllib
    import urllib2
    
    url = 'http://www.someserver.com/cgi-bin/register.cgi'
    values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }
    data = urllib.urlencode(values)  #数据需要重新编码成合适的格式,这里使用的时urllib中得方法,因为urllib2中没有编码的方法
    req = urllib2.Request(url, data)  # #这里将需要上传的数据,传递给了equest对象,作为它的参数
    response = urllib2.urlopen(req)
    the_page = response.read()

    关于其它类型的数据上传,可以看这里

    除了使用post方式上传数据外,还可以使用get方式上传数据,get上传和post上传明显的区别就是get上传的数据会在URL中得尾部显示出来。可以看下面的代码:


    import urllib
    import urllib2
    
    data = {}
    data['name'] = 'Somebody Here'
    data['location'] = 'Northampton'
    data['language'] = 'Python'
    
    url_values = urllib.urlencode(data)
    print url_values  # 这里的顺序不一定
    
    url = 'http://www.example.com/example.cgi'
    full_url = url + '?' + url_values
    data = urllib2.urlopen(full_url)

    可以悄悄打印出来url_value的形式。


    HTTP头—描述数据的数据

    现在,我们来讨论一下HTTP头,来看看如何在你的HTTP的Request对象,增加一个HTTP头。

    有一些网站,它比较智能,它不喜欢被程序访问(非人为的点击只会加重它服务器的负担)。或者有些网站更加智能点,对于不同的浏览器,会发送不同的网页数据。

    可是呢,urllib2默认,会这样标示自己,Python-urllib/x.y(其中,x和y分别是大小版本号,例如我现在使用的时Python-urllib/2.7);而这些数据可能会让一些站点觉得迷惑,要是遇上了不喜欢被程序访问的网站,那么这样的访问可能会直接被忽视。所以,你可以构造一些身份,让站点不会拒绝你。看下面的例子。

    import urllib
    import urllib2
    
    url = 'http://www.someserver.com/cgi-bin/register.cgi'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' #user_agent用来标示你的浏览器的,向这里就是mozilla
    values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }
    
    headers = { 'User-Agent' : user_agent }
    data = urllib.urlencode(values)
    
    req = urllib2.Request(url, data, headers)
    
    response = urllib2.urlopen(req)
    
    the_page = response.read()    


    异常

    异常时常有,要小心提防呐!想想一般文件操作的时候,会有什么异常呢?文件无法打开,什么权限不够啊,文件不存在啊等等异常。同样的,对于URL访问,也会遇到这些问题,(python一些内部异常,例如ValueError,TypeError等异常,也可能会发生)


    URLError

    先说说URLError,当没有网络连接,或者访问的服务器地址不存在的时候,在这种情况下,URLError会被抛出来,这个时候,URLError异常会有个“reason”属性,它是一个元组,包含error code(int型)和text error message(string型),看下面的代码

    import urllib
    import urllib2
    
    
    req = urllib2.Request('http://www.pretend_server.org')
    try: urllib2.urlopen(req)
    except urllib2.URLError as e:
        print e.reason

    输出[Errno 8] nodename nor servname provided, or not known;输出的内容就是reason,


    HTTPError

    每一个HTTP访问,会从服务器那儿获得一个“status code”(状态码),通常这些状态码告诉我们服务器无法满足一些访问(直白点说就是一些数据而已,只不过表示的是当前访问的状态,比如当前访问被拒绝了,status code可以告诉你,你哪些举动过分了,出格了,注意,咸猪手不可以有啊~~)。

    不过呢,urllib2的默认处理器能够帮助你处理一些服务器的响应,比如说你当前访问的网址被服务器重定向了,就是说你的服务器给你一个新的URL访问了,处理器会帮你直接去访问新的URL。

    但是默认的处理器毕竟功能有限,它不能帮助你解决所有问题,比如你访问的网站不存在了(对应404错误,我们有时候会看到这个错误),或者你的访问被禁止了(对应403错误,禁止的原因可能是因为你的权限不够啦等等),又或者是需要你验证啦(对应401)。具体的其它错误本文就不介绍啦,具体可以看这里

    让我们看下面的程序,看一下当HTTPError的404错误,也就是页面不存在时候,它会输出点什么。

    import urllib
    import urllib2
    
    
    req = urllib2.Request('http://www.zhonghuan.info/no_way')
    try: urllib2.urlopen(req)
    except urllib2.HTTPError as e:
           print e.code;
         print e.read();    

    输出:
    404

    <!DOCTYPE html>

    <title>Page not found &middot; GitHub Pages</title>


    处理异常

    假设你想要捕捉HTTPError和URLError,有两种基本的方法,推荐第二种噢!

    第一种:

    from urllib2 import Request, urlopen, URLError, HTTPError
    
    
    req = Request(http://zhonghuan.info)
    try:
        response = urlopen(req)
    except HTTPError as e:
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code
    except URLError as e:
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    else:
        # everything is fine

    第一种方法,HTTPError一定要放在URLError前面,原因呢,和很多语言的异常处理机制一样,HTTPError是URLError的子类,如果发生了HTTPError,它可以被当做是URLError被捕捉。

    第二种:

    from urllib2 import Request, urlopen, URLError
    
    
    req = Request(someurl)
    try:
           response = urlopen(req)
    except URLError as e:
        if hasattr(e, 'reason'):
            print 'We failed to reach a server.'
            print 'Reason: ', e.reason
        elif hasattr(e, 'code'):
            print 'The server couldn\'t fulfill the request.'
            print 'Error code: ', e.code
    else:
        # everything is fine        
    


    info和geturl

    这里介绍两个方法info()和geturl();

    geturl():该方法会返回访问的页面的真实的URL,它的价值在于我们访问的网页可能会被重定向,所以导致访问的URL和我们输入的可能不一样。看下面的例子:

    import urllib
    import urllib2
    
    url = 'http://weibo.com/u/2103243911';
    req = urllib2.Request(url);
    response = urllib2.urlopen(req)
    
    print "URL:",url;
    print "After redirection:",response.geturl();

    以我的微博个人主页为例,其实真实访问被重定向了,真实的网址,从输出中可以看出:

    URL: http://weibo.com/u/2103243911

    After redirection: http://passport.weibo.com/visitor/visitor?a=enter&url=http%3A%2F%2Fweibo.com%2Fu%2F2103243911&_rand=1409761358.1794



    info():可以得到描述页面的信息,返回的是一个httplib.HTTPMessage实例,打印出来很像字典。看下面的代码:

    import urllib
    import urllib2
    
    
    url = 'http://zhonghuan.info';
    req = urllib2.Request(url);
    response = urllib2.urlopen(req);
    print response.info();
    print response.info().__class__;

    输出:

    Server: GitHub.com
    Content-Type: text/html; charset=utf-8
    Last-Modified: Tue, 02 Sep 2014 17:01:39 GMT
    Expires: Wed, 03 Sep 2014 15:23:02 GMT
    Cache-Control: max-age=600
    Content-Length: 4784
    Accept-Ranges: bytes
    Date: Wed, 03 Sep 2014 16:38:29 GMT
    Via: 1.1 varnish
    Age: 5127
    Connection: close
    X-Served-By: cache-lax1433-LAX
    X-Cache: HIT
    X-Cache-Hits: 1
    X-Timer: S1409762309.465760,VS0,VE0
    Vary: Accept-Encoding
    
    Class: httplib.HTTPMessage



    Opener和Handler

    这里介绍Opener和Handler。

    什么是Opener呢?其实上面的例子我们一直在用Opener了,就是urlopen。这个是默认的opener,网络访问情况很多,你可以创建比较合适的opener,

    什么是Handler呢?其实Opener会调用Handler来处理访问中得琐事,所以Handler很重要,对于特定的协议(例如FTP,HTTP),它知道如何如何处理访问,例如它会帮你处理重定向问题。

    在访问的时候,你可能对于Opener有一些要求,例如,你希望得到的Opener能够处理cookie,或者你不希望Opener帮助你处理重定向。

    我们如何生成需要得Opener呢?(这里插一下,个人觉得这里的Opener生成方式,和设计模式中得生成器欧式,又叫建造者模式,英文名称Builder Pattern;有些相似,不过不完全一样,但总觉得,在看下去之前,先了解一下这个模式会有好处,没有接触过的朋友可以看这篇Builder pattern);

    要创建一个 opener,可以实例化一个OpenerDirector,
    然后调用.add_handler(some_handler_instance)。

    不过,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。
    其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。

    刚刚提到handler会帮我们处理重定向,但是,如果我们不想要重定向呢,该怎么办,自定义一个handler。看下面的代码:

    mport urllib
    import urllib2
    
    
    class RedirectHandler(urllib2.HTTPRedirectHandler):# 这个RedirectHandler继承了HTTPRedirectHandler,不过,它覆盖了父类的方法,让它什么都不做,失去了重定向的功能。
        def http_error_301(self, req, fp, code, msg, headers):
            pass
        def http_error_302(self, req, fp, code, msg, headers):
            pass
    
    
    webo = "http://weibo.com/u/2103243911"; #访问的是我的微博页面,因为正常情况下,访问时会发生重定向
    opener = urllib2.build_opener(RedirectHandler) #这里,我们自定义了一个opener,添加了一个重定向时处理的自定义handler
    response = opener.open(webo);# response  = urllib2.urlopen(webo);
    print response.geturl();
    urllib2.install_opener(opener);  #安装自定义的opener,以后调用urllib2的时候,返回的就是这个opener。

    输出结果是:
    urllib2.HTTPError: HTTP Error 302: Moved Temporarily

    之所以发生http error 302,是因为本来访问我的微博个人主页的时候,它应该发生重定向的,可是我们自己的重定向Handler什么都不做,结果就是发生异常了。

    可以看看下面的urllib2关于创建自定义Opener的类图





    Basic Authentication

    如果一个网站,他提供注册登入这些功能,那么一般它有用户名/密码,如果你访问的页面,系统要求你提供用户名/密码,这个过程叫做Authentication,实在服务器那端所做的操作。它给一些页面提供了安全保护。

    一个基本的Authentication(验证)过程是这样的:

    1. 客户端提出请求访问某些页面。
    2. 服务器返回一个错误,要求进行身份验证。
    3. 客户端把用户名/密码(一般这样)编码后发给服务器。
    4. 服务器检查这对用户名/密码是否正确,然后返回用户请求的页面或者是一些错误。

    上面的过程,还有可能是其它形式,这里只是举个比较普遍的。

    通常服务器返回的是401错误,表明访问的网页未授权,同时,返回的response的header内有形如

    WWW-Authenticate: SCHEME realm="REALM".

    的内容,例如,你想要访问cPanel的管理应用程序,你会收到这样的header:WWW-Authenticate: Basic realm="cPanel"(cPanel 是一套在网页寄存业中最享负盛名的商业软件,其基于 Linux 和 BSD 系统及以 PHP 开发且性质为闭源软件;cPanel 主要是面向客户权级的控制系统)

    当我们访问页面的时候,opener会调用handler来处理各种情况,而处理Authentication的handler是urllib2.HTTPBasicAuthHandler,同时需要一个用户密码管理器urllib2.HTTPPasswordMgr。

    不幸的时,HTTPPasswordMgr有一个小问题,就是在获取网页前,你需要知道它的realm。幸运的是,它有一个表兄弟HTTPPasswordMgrWithDefaultRealm,这个表兄弟可以事先不知道realm,在realm参数位置上,可以传一个None进去,它更友好的被使用。

    下面参考下面的代码:

    import urllib2
    
    
    url = 'http://www.weibo.com'#分别对应域名,账号,密码
    username = 'zhonghuan'
    password = 'forget_it'
    passman = urllib2.HTTPPasswordMgrWithDefaultRealm() #创建密码管理器
    passman.add_password(None, url, username, password)# 参数形式(realm,URL,UserName,Password)
    authhandler = urllib2.HTTPBasicAuthHandler(passman)#创建Authentication的handler
    opener = urllib2.build_opener(authhandler)
    urllib2.install_opener(opener) #和上面介绍的一样,install_opener后,每次调用urllib2的urlopen,返回的就是这个opener
    pagehandle = urllib2.urlopen(url)



    代理

    有时候,我们本机不能直接访问,需要代理服务器去访问。urllib2对这个设置代理支持的还不错,可以直接实例化ProxyHandler,它的参数是一个map,key值是代理的访问协议名称,value值是代理的地址。看下面的代码实现。

    import urllib2
    
    
    enable_proxy = True
    proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
    null_proxy_handler = urllib2.ProxyHandler({})
    if enable_proxy:
        opener = urllib2.build_opener(proxy_handler)
    else:
        opener = urllib2.build_opener(null_proxy_handler)
    urllib2.install_opener(opener)



    Timeout 设置

    在老版 Python 中,urllib2 的 API 并没有暴露 Timeout 的设置,要设置 Timeout 值,只能更改 Socket 的全局 Timeout 值。

    import urllib2
    import socket
    
    
    socket.setdefaulttimeout(10) # 10 秒钟后超时
    urllib2.socket.setdefaulttimeout(10) # 另一种方式

    在 Python 2.6 以后,超时可以通过 urllib2.urlopen() 的 timeout 参数直接设置。

    import urllib2
    
    response = urllib2.urlopen('http://www.google.com', timeout=10)



    urllib2 对 Cookie 的处理也是自动的。如果需要得到某个 Cookie 项的值,可以这么做:

    import urllib2
    import cookielib
    
    
    cookie = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
    response = opener.open('http://www.google.com')
    for item in cookie:
        if item.name == 'some_cookie_item_name':
            print item.value



    Debug Log

    使用 urllib2 时,可以通过下面的方法把 debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试,有时可以省去抓包的工作

    import urllib2
    
    
    httpHandler = urllib2.HTTPHandler(debuglevel=1)
    httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
    opener = urllib2.build_opener(httpHandler, httpsHandler)
    urllib2.install_opener(opener)
    response = urllib2.urlopen('http://www.google.com')


    参考资料:

    1. python urllib2的使用 (推荐)

    2. python网络爬虫入门教程 (推荐)

    3. CGI脚本入门 (推荐)

    4. urllib2 源码小剖

    5. Python 标准库 urllib2 的使用细节 (推荐)

    6. Authentication with Python (推荐)

    7. http://en.wikipedia.org/wiki/List_of_HTTP_header_fields


    展开全文
  • 精通Python网络爬虫网络爬虫学习路线【普及贴】 随着大数据时代的到来,人们对数据资源的需求越来越多,而爬虫是一种很好的自动采集数据的手段。 那么,如何才能精通Python网络爬虫呢?学习Python网络爬虫的路线...

    精通Python网络爬虫之网络爬虫学习路线【普及贴】

    随着大数据时代的到来,人们对数据资源的需求越来越多,而爬虫是一种很好的自动采集数据的手段。

    那么,如何才能精通Python网络爬虫呢?学习Python网络爬虫的路线应该如何进行呢?在此为大家具体进行介绍。

    1、选择一款合适的编程语言

    事实上,Python、PHP、JAVA等常见的语言都可以用于编写网络爬虫,你首先需要选择一款合适的编程语言,这些编程语言各有优势,可以根据习惯进行选择。在此笔者推荐使用Python进行爬虫项目的编写,其优点是:简洁、掌握难度低。

    2、掌握Python的一些基础爬虫模块

    当然,在进行这一步之前,你应当先掌握Python的一些简单语法基础,然后才可以使用Python语言进行爬虫项目的开发。

    在掌握了Python的语法基础之后,你需要重点掌握一个Python的关于爬虫开发的基础模块。这些模块有很多可以供你选择,比如urllib、requests等等,只需要精通一个基础模块即可,不必要都精通,因为都是大同小异的,在此推荐的是掌握urllib,当然你可以根据你的习惯进行选择。

    3、深入掌握一款合适的表达式

    学会了如何爬取网页内容之后,你还需要学会进行信息的提取。事实上,信息的提取你可以通过表达式进行实现,同样,有很多表达式可以供你选择使用,常见的有正则表达式、XPath表达式、BeautifulSoup等,这些表达式你没有必要都精通,同样,精通1-2个,其他的掌握即可,在此建议精通掌握正则表达式以及XPath表达式,其他的了解掌握即可。正则表达式可以处理的数据的范围比较大,简言之,就是能力比较强,XPath只能处理XML格式的数据,有些形式的数据不能处理,但XPath处理数据会比较快。

    4、深入掌握抓包分析技术

    事实上,很多网站都会做一些反爬措施,即不想让你爬到他的数据。最常见的反爬手段就是对数据进行隐藏处理,这个时候,你就无法直接爬取相关的数据了。作为爬虫方,如果需要在这种情况下获取数据,那么你需要对相应的数据进行抓包分析,然后再根据分析结果进行处理。一般推荐掌握的抓包分析工具是Fiddler,当然你也可以用其他的抓包分析工具,没有特别的要求。

    5、精通一款爬虫框架

    事实上,当你学习到这一步的时候,你已经入门了。

    这个时候,你可能需要深入掌握一款爬虫框架,因为采用框架开发爬虫项目,效率会更加高,并且项目也会更加完善。

    同样,你可以有很多爬虫框架进行选择,比如Scrapy、pySpider等等,一样的,你没必要每一种框架都精通,只需要精通一种框架即可,其他框架都是大同小异的,当你深入精通一款框架的时候,其他的框架了解一下事实上你便能轻松使用,在此推荐掌握Scrapy框架,当然你可以根据习惯进行选择。

    6、掌握常见的反爬策略与反爬处理策略

    反爬,是相对于网站方来说的,对方不想给你爬他站点的数据,所以进行了一些限制,这就是反爬。

    反爬处理,是相对于爬虫方来说的,在对方进行了反爬策略之后,你还想爬相应的数据,就需要有相应的攻克手段,这个时候,就需要进行反爬处理。

    事实上,反爬以及反爬处理都有一些基本的套路,万变不离其宗,这些后面作者会具体提到,感兴趣的可以关注。

    常见的反爬策略主要有:

    IP限制

    UA限制

    Cookie限制

    资源随机化存储

    动态加载技术

    ……

    对应的反爬处理手段主要有:

    IP代理池技术

    用户代理池技术

    Cookie保存与处理

    自动触发技术

    抓包分析技术+自动触发技术

    ……

    这些大家在此先有一个基本的思路印象即可,后面都会具体通过实战案例去介绍。

    7、掌握PhantomJS、Selenium等工具的使用

    有一些站点,通过常规的爬虫很难去进行爬取,这个时候,你需要借助一些工具模块进行,比如PhantomJS、Selenium等,所以,你还需要掌握PhantomJS、Selenium等工具的常规使用方法。

    8、掌握分布式爬虫技术与数据去重技术

    如果你已经学习或者研究到到了这里,那么恭喜你,相信现在你爬任何网站都已经不是问题了,反爬对你来说也只是一道形同虚设的墙而已了。

    但是,如果要爬取的资源非常非常多,靠一个单机爬虫去跑,仍然无法达到你的目的,因为太慢了。

    所以,这个时候,你还应当掌握一种技术,就是分布式爬虫技术,分布式爬虫的架构手段有很多,你可以依据真实的服务器集群进行,也可以依据虚拟化的多台服务器进行,你可以采用urllib+redis分布式架构手段,也可以采用Scrapy+redis架构手段,都没关系,关键是,你可以将爬虫任务部署到多台服务器中就OK。

    至于数据去重技术,简单来说,目的就是要去除重复数据,如果数据量小,直接采用数据库的数据约束进行实现,如果数据量很大,建议采用布隆过滤器实现数据去重即可,布隆过滤器的实现在Python中也是不难的。

    以上是如果你想精通Python网络爬虫的学习研究路线,按照这些步骤学习下去,可以让你的爬虫技术得到非常大的提升。

    至于有些朋友问到,使用Windows系统还是Linux系统,其实,没关系的,一般建议学习的时候使用Windows系统进行就行,比较考虑到大部分朋友对该系统比较数据,但是在实际运行爬虫任务的时候,把爬虫部署到Linux系统中运行,这样效率比较高。由于Python的可移植性非常好,所以你在不同的平台中运行一个爬虫,代码基本上不用进行什么修改,只需要学会部署到Linux中即可。所以,这也是为什么说使用Windows系统还是Linux系统进行学习都没多大影响的原因之一。

    本篇文章主要是为那些想学习Python网络爬虫,但是又不知道从何学起,怎么学下去的朋友而写的。希望通过本篇文章,可以让你对Python网络爬虫的研究路线有一个清晰的了解,这样,本篇文章的目的就达到了,加油!

    展开全文
  • 网络爬虫学习笔记(1) 1 资料 《Python网络爬虫从入门到实践》唐松,陈志铨。主要面向windows平台下的python3。 2 笔记 2-1 爬虫概述 (约2016年)网络爬虫个人使用和科研范畴基本不存在问题,但商业盈利范畴就要...

    网络爬虫学习笔记(1)

    1 资料

    《Python网络爬虫从入门到实践》唐松,陈志铨。主要面向windows平台下的python3。

    2 笔记

    2-1 爬虫概述

    1. (约2016年)网络爬虫个人使用和科研范畴基本不存在问题,但商业盈利范畴就要看对方了。
    2. 通过网站的Robots协议(爬虫协议)可以知道可以和不可以抓取的内容,例如淘宝的[link]https://www.taobao.com/robots.txt。其中User-Agent: 为允许的url,Allow:为允许的内容,Disallow: 为不允许。Disallow: /为禁止抓取允许以外的内容。 Disallow: /abc 表示禁止访问收录abc.php、abc.html和abc文件夹下的所有文件。 Disallow: /abc/ 表示仅禁止访问abc文件夹下的所有文件,但是不限制abc.php、abc.html文件。
    3. 爬取的时候要遵循Robots协议,约束网络爬虫程序速度;使用数据时必须遵守网站的知识产权。
    4. 爬虫流程:1)获取网站,2)解析网页(提取数据),3)存储数据。
    5. 4-1)获取网站——基础技术:request、urllib、selenium(模拟浏览器);进阶技术:多进程多线程抓取、登陆抓取、突破IP封禁、服务器抓取。
    6. 4-2)解析网页——基础技术:re正则表达式、BeautiSoup、lxml
    7. ;进阶技术:解决中文乱码。
    8. 4-3)存储数据——基础技术:txt文件、csv文件;进阶技术:MySQl、MongoDB。

    2-2 安装

    1. 安装Anaconda来一键安装python编码环境。利用pip(window进cmd,Mac进terminal)安装bs4、request、lxml等第三方库。
     pip install bs4
     pip install request
     pip install lxml
    
    1. 编译器Jupyter(其他还有Notepad++、SublimeTexture、Spyder),cmd下输入jupyter notebook浏览器启动Jupyter界面
      *(自己弄的部分)Spyder安装pip install --pre -U spyder……好像有Anaconda最好不要用这个,具体看[link]https://github.com/spyder-ide/spyder/releases

    2-3 Python基础(1)

    1. 严格的代码缩进,以Tab键或者4个空格进行缩进。
    2. “#”后面是注释
    3. *python没有限制关键字,方法和变量名也没有加以区分,编写的时候自己得注意取不同的名字。变量会根据赋值的内容自动决定类型。
    4. 输出语句
     print(“内容”)
    
    1. 4种 数据类型 :1)String字符串、2)Number数字、3)list列表、4)Dictionaries字典。
    2. String字符串——‘和“都可以用来放字符串,可以使用+来连接。
    string1 ='abc'
    str = "fe"
    print(string1+str)
    
    1. Number数字——常用的有int(整数)和float(浮点数)两种。如果要转换,在变量前加int或float。注意Number不能直接和string相加
    thisSeven = 7
    float1 = 1.1
    chase = int(float1)
    print(thisSeven+chase)
    

    另外,Number还有长整数和复数。
    5. list列表——列表可以包括任意种类数据类型!此外可以通过[起始下标:结束下标]其他的倒和一般的数组没什么区别。
    *用[]赋值,查询也是[]

    list1 = ['a', 2, "new", 1.9]
    print(list1[1:3])
    list1[3] = float(list1[1])
    print(list1)
    

    6.Dictionaries字典——可变容器模型,含有key和value(就是键值对啦)。key必须唯一,value可用任意种类数据类型。
    *用{}赋值,但用[]查询

    notebook = {"name": '1234', "age":7, "class":"first"}
    print(notebook["name"])
    print(notebook)
    #循环遍历notebook的键和值
    for key1, value1 in notebook.items():
       print(key1, value1)
    
    展开全文
  • python例程,可用于python程序的学习网络爬虫例程,
  • 网络爬虫学习笔记(2) 元组,条件语句,循环语句,函数,类,模块

    网络爬虫学习笔记(2)

    1 资料

    • 《Python网络爬虫从入门到实践》唐松,陈志铨。主要面向windows平台下的python3。
    • 菜鸟教程-》python

    2 笔记

    2-1 Python基础(1)++

    1. python的列表还有一种只读格式——元组Tuple,它用()进行赋值,且只能在初始化时赋值。
    2. 列表有追加元素的内置方法append()
    3. 字典有内置方法keys()(获得所有键的值),values()
    4. 元组用 “( )” 标识, 列表用 “[ ]” 标识,字典用 “{ }” 标识
    5. type(变量) 查看该变量的数据类型,还可以用 isinstance(变量,类型) 来判断是不是那种类型。type()不会认为子类是一种父类类型,isinstance()会认为子类是一种父类类型。

    2-2 Python基础(2)

    1. 条件语句——格式上是if 条件 :,取代Java中()的是一个在最后的:同样有else存在(但是else后面要加:),另外还有else if简写而成的elif。
    a = 'book'
    b = 'java'
    c = "book"
    if a == b :
        print(a)
    else :
        print('a!=b')
    if a == c :
        print(a)
    elif b == c :
        print('b==c')
    else :
        print('c!=a/b')
    
    1. 循环语句——常用的有for循环和while循环两种,同样是()变成末尾的:。不过python的for循环形式上更接近foreach循环,python中的循环还可以使用else。
    myBook = ['java', 'python', 'c']
    for book in myBook:
        print(book)
    print('\n')
    for i,j in enumerate(('a','b','c')):
        print (i,j)
    for i,j in enumerate(myBook):
        print (i,j)
    count = 0
    while count < 3:
        print(myBook[count])
        count = count + 1
    

    for循环中利用内置函数 len() 和 range(),函数 len() 返回列表的长度,即元素的个数, range返回一个序列的数。(例子来自菜鸟)(菜鸟你的括号呢?)

    fruits = ['banana', 'apple',  'mango']
    for index in range(len(fruits)):
       print ('当前水果 :', fruits[index])
    

    else使用例子(例子来自菜鸟)

    for num in range(10,20):  # 迭代 10 到 20 之间的数字
       for i in range(2,num): # 根据因子迭代
          if num%i == 0:      # 确定第一个因子
             j=num/i          # 计算第二个因子
             print ('%d 等于 %d * %d' % (num,i,j))
             break            # 跳出当前循环
       else:                  # 循环的 else 部分,不break跳出循环的话就会执行
          print (num, '是一个质数')
    

    此外循环中可以用continue、break、pass(什么也不做)。
    3. 函数——参数(()里的内容)必须要正确地写入函数中

    def add(x):
        y = x + 1
        return y
    w = 1
    print(w)
    print(add(w))
    
    1. 运算符,这里只提一下python中有**——幂 - 返回x的y次幂,//——取整除 - 返回商的整数部分(向下取整)并且没有++、–(- -,间隙被间隙掉了!)。另外与或非分别写成and、or、not。python还有成员运算符in、not in;身份运算符is,not is(用于比较两个对象的存储单元)
    class Person:
        #这是一个类变量,它的值将在这个类的所有实例之间共享
        n = 0 
        #__init__构造方法,注意前后均有两个_
        #self 代表类的实例,self 在定义类的方法时是必须有的
        #,虽然在调用时不必传入相应的参数。
        def __init__(self, name, age): 
            self.name = name
            self.age = age
        def detail(self): #通过这个函数来调用被封装的内容
            print(self.name)
            print(self.age)
            
    obj1 = Person('sss', 16)#对象声明
    obj1.detail() 
    obj1.name
    obj1.n
    

    继承格式

    class 子类名(父类名):
    

    构造方法重写时用super关键字来使用父类构造方法

    class Father(object):
        def __init__(self, name):
    class Son(Father):
        def __init__(self, name):
        super(Son, self).__init__(name)
    
      1. 基础重载方法
        下表列出了一些通用的功能,可以在自己的类重写:
    __init__ ( self [,args...] )
    构造函数
    简单的调用方法: obj = className(args)
    __del__( self )
    析构方法, 删除一个对象
    简单的调用方法 : del obj
    __repr__( self )
    转化为供解释器读取的形式
    简单的调用方法 : repr(obj)
    __str__( self )
    用于将值转化为适于人阅读的形式
    简单的调用方法 : str(obj)
    __cmp__ ( self, x )
    对象比较
    简单的调用方法 : cmp(obj, x)
    
    1. 模块Module——是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。使用 import 语句来引入模块。
    # 导入模块
    import support 
    # 现在可以调用模块里包含的函数了
    support.print_func("Runoob")
    
    展开全文
  • Python网络爬虫学习笔记(定向)

    千次阅读 2017-03-20 22:39:14
    IDE的安装,个人习惯了JetBrains的PyCharm,我们平日里做各种小程序,学习之类的下载社区版本(免费版)即可,下载网址为:PyCharm下载地址。双击一步步执行下去即可。以安装Django为例,讲解一下pip
  • Python学习前传 —— Python网络爬虫

    千次阅读 2018-03-11 23:14:14
    我们先不讲Python基础,我们直接来看一段网络爬虫代码,看一下Python语言的特点。那么什么是网络爬虫呢?网络爬虫,又称为网络蜘蛛(WebSpider),非常形象的一个名字。如果你把整个互联网想象成类似于...
  • 简单爬虫,pychram 导入模块前置工作
  • 由于工作需要,最近刚刚开始自学python爬虫,最终的目标是能够随心所欲的爬取各种能看到的网页内容。这同时也是在CSDN上第一篇博客,作为一个崭新的开始吧。  本文实现的功能是,下载验证码并显示。提示:需要下载...
  • Python网络爬虫实战

    2019-03-21 22:26:29
    介绍网络爬虫开发技术,对大家学习python很有帮助。提供爬虫必学知识 密码:123456
  • python网络爬虫

    千次阅读 2015-01-06 22:57:10
    Python网络爬虫简明教程 通过本教程可以快速了解网络爬虫过程,对一般性数据抓取有启发意义。
  • 今天给大家推荐一位软件开发工程师兼Python网络爬虫与数据分析爱好者,它是「Python爬虫与数据挖掘」公众号号主Python进阶者。他系一名软件开发工程师,在工作之余,热爱P...
  • Python3网络爬虫快速入门实战解析

    万次阅读 多人点赞 2017-09-28 14:48:41
    请在电脑的陪同下,阅读本文。本文以实战为主,阅读过程...本文的实战内容有:网络小说下载(静态网站)、优美壁纸下载(动态网站)、爱奇艺VIP视频下载 PS:本文为Gitchat线上分享文章,该文章发布时间为2017年09月19日。
  • 本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解Python网络爬虫(XPath、Beautiful Soup和pyquery)解析库的使用,抓包工具的使用,以及如何实现图片信息爬取和Ajax信息的爬取。后给大家分享一个...
  • 主要介绍了python网络爬虫 CrawlSpider使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 精通Python 网络爬虫

    2018-04-20 14:26:50
    详细讲述了python的简单爬虫,到框架学习,以及简单项目实战训练,这是了解python爬虫的基础入门的宝贵而又高效的材料
  • 原标题:Python网络爬虫与文本数据分析在过去的两年间,Python一路高歌猛进,成功窜上“最火编程语言”的宝座。惊奇的是使用Python最多的人群其实不是程序员,而是数据科学家,尤其是社会科学家,涵盖的学科有经济学...
  • Python网络爬虫(零)

    千次阅读 热门讨论 2021-04-06 22:43:39
    Python网络爬虫学习笔记 最近一直在准备大数据比赛,
  • 本书从系统化的视角,为那些想学习Python网络爬虫或者正在研究Python网络爬虫的朋友们提供了一个全面的参考,让读者可以系统地学习Python网络爬虫的方方面面,在理解并掌握了本书的实例之后,能够独立编写出自己的...
  • python网络爬虫学习 (一)通过GET和POST方式获取页面内容网络爬虫,即Web Spider,是一个很形象的名字。 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。HTTP协议中定义了四个与服务器进行交互的...
  • python网络爬虫.zip

    2021-04-26 23:30:21
    网络爬虫与数据分析简介,适合初学者学习,内容简单,涵盖广。
  • 基于项目学习法的python网络爬虫教学探究.pdf
  • Python网络爬虫上手很快,能够尽早入门,可是想精通确实是需求些时间,需求达到爬虫工程师的级别更是需求煞费苦心了,接下来共享的学习道路是针对小白或许学习Python网络爬虫不久的同伴们。 学习网络爬虫能够分三步...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,294
精华内容 18,917
关键字:

python网络爬虫学习计划

python 订阅
爬虫 订阅