精华内容
下载资源
问答
  • 主要介绍了Python爬虫抓取指定网页图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 可以直接下载整站的图片 代码中使用多线程进行批量下载 代码中相关的内容已经加了注释 下载的同学应该可以自行修改里面的代码
  • 本实验将利用python程序抓取网络图片,完成可以批量下载一个网站的照片。所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 原理 1、网络爬虫 即Web Spider,网络蜘蛛是通过网页的链接...

    爬虫图片

    本实验将利用python程序抓取网络图片,完成可以批量下载一个网站的照片。所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。

    原理

    1、网络爬虫

    即Web Spider,网络蜘蛛是通过网页的链接地址来寻找网页的。从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。

    网络爬虫的基本操作是抓取网页。

    2、浏览网页过程

    抓取网页的过程其实和读者平时使用浏览器浏览网页的道理是一样的。打开网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了
    一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。浏览器的功能是将获取到的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。

    URL的格式由三部分组成:


    第一部分是协议(或称为服务方式)。


    第二部分是存有该资源的主机IP地址(有时也包括端口号)。


    第三部分是主机资源的具体地址,如目录和文件名等。

    第一部分和第二部分用“😕/”符号隔开,

    第二部分和第三部分用“/”符号隔开。

    第一部分和第二部分是不可缺少的,第三部分有时可以省略。

    爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它
    进行进一步的处理。

    因此,准确地理解URL对理解网络爬虫至关重要。

    3、利用urllib2通过指定的URL抓取网页内容

    在Python中,我们使用urllib2这个组件来抓取网页。

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。

    它以urlopen函数的形式提供了一个非常简单的接口。

    4、HTTP的异常处理问题

    当urlopen不能够处理一个response时,产生urlError。

    不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。

    HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

    5、Timeout 设置(超时设置)

    在Python2.6前,urllib2 的API 并没有暴露 Timeout 的设置,要设置
    Timeout 值,只能更改 Socket 的全局Timeout 值。在 Python 2.6 以后,超时可以通过 urllib2.urlopen() 的 timeout 参数直接设置。

    项目架构

    项目包含两个文件,pet_spider.py和main_file.py。其中pet_spider.py文件定义了类PetSpider,包含3个方法分别是get_html_content下载网页源代码、get_urls获得网页图片urls、
    download_images下载图片。main_file.py文件定义了主函数main,用于调用PetSpider类。

    代码

    根据给定的网址来获取网页详细信息,得到的html就是网页的源代码。

    get_html_content函数主要功能是递归下载网页源代码。注意将byte类型转换成string类型,其中re.findall的含义是返回string中所有与pattern(正则表达式)相匹配的全部字串,返回形式为数组。

    新建pet_spider.py。
    首先实现获取网页源代码的函数:

    #import libraries
    import requests
    import re
    import os
    
    #define class
    
    class PetSpider():
        def __init__(self, image_path, html_path, url_path):
            self.image_path = image_path
            self.html_path = html_path
            self.url_path = url_path
    
            #get webpages
        def get_html_content(self, url, url_prefix):
            r = requests.get(url, timeout=60)
            page_content = r.content.decode('utf-8')
            page_div = re.compile(r'<div class="page">(.*?)</div>', re.I|re.S|re.M).findall(page_content)
            if page_div:
                current_page = re.compile(r'<a class ="current" href="javascript:void\(0\);">(.*?)</a>',re.I|re.S|re.M).findall(page_div[0])
                if current_page:
                    html_file_name = '%s/web_page_%s.txt' %(self.html_path, current_page[0])
                    print('downloading %s' %(html_file_name))
                    f = open(html_file_name, "wb")
                    f.write(r.content)
                    f.close()
                else:
                    print('current_page not fount')
                next_url = re.compile(r'<a class="next" href="(.*?)">&raquo;</a>',re.I|re.S|re.M).findall(page_div[0])
                if next_url:
                    next_url = url_prefix + next_url[0]
                    self.get_html_content(next_url, url_prefix)
                else:
                    if current_page:
                        print('download over')
                    else:
                        print('next_url not found')
            else:
                print('page_div not found')
    

    在这里插入图片描述
    获取网页源代码后,从网页源代码中匹配过滤图片的urls,制作进度条,从文件中读出网页图片内容,最后将所有urls写入文件。

    继续向pet_spider.py文件中添加如下代码:

    #get urls from webpages
    def get_urls(self):
        url_content = ''
        for _, _, file_list in os.walk(self.html_path):
            pass
        file_count = len(file_list)
        counter = 1
    
        for i in file_list:
            file_name = '%s/%s' %(self.html_path, i)
            print('extracting urls from %s. %d/%d' %(file_name, counter, file_count))
            f = open(file_name, "rb")
            page_content = f.read().decode('utf-8')
            f.close()
            urls = re.compile(r'<img src="(.*?)" />',re.I|re.S|re.M).findall(page_content)
            if urls:
                for i in urls:
                    if i.find('alt') >=0:
                        continue
                    url_content += i
                    url_content += '\n'
                else:
                    print('url not found')
                counter += 1
    
        #write urls into file
        f = open('%s/urls.txt' %(self.url_path), "wb")
        f.write(bytes(url_content, encoding='utf8'))
        f.close()
    

    现将所有图片url过滤出来

    将图片下载到本地,首先将urls字符串保存到列表中,遍历列表中的urls,将下载的图片保存在文件中。

    继续向pet_spider.py文件中添加如下代码:

    #download images
        def download_images(self):
            rows = open('%s/urls.txt' %(self.url_path)).read().split("\n")
            current_image_number = 1
            urls_count = len(rows)
    
            for url in rows:
                try:
                    #try to download the image
                    r = requests.get(url, timeout=60)
                    #save the image to disk
                    image_file = '%s/img_%d.jpg' %(self.image_path, current_image_number)
                    f = open(image_file, "wb")
                    f.write(r.content)
                    f.close()
                    print('download %s. %d/%d' %(image_file, current_image_number, urls_count))
                    current_image_number += 1
                except:
                    print('%s has an exception. skip.' %(url))
    
    

    在这里插入图片描述

    主函数

    新建main_file.py文件。代码如下:

    import os
    from pet_spider import PetSpider
    
    if __name__ == '__main__':
        url = 'http://pet.lelezone.com/mao/'
        url_prefix = 'http://pet.lelezone.com'
        image_path = 'cats'
        html_path = 'html'
        url_path = 'url'
    
        if not os.path.isdir(image_path):
            os.makedirs(image_path)
        if not os.path.isdir(url_path):
            os.makedirs(html_path)
        if not os.path.isdir(url_path):
            os.makedirs(url_path)
    
        pet_spider = PetSpider(image_path, html_path, url_path)
        print('Download webpages.')
        pet_spider.get_html_content(url,url_prefix)
        print('Extract urls.')
        pet_spider.get_urls()
        print('Download images')
    pet_spider.download_images()
    

    最后运行主函数爬取图片。
    (可以直接运行。如果无法爬取,请检查缩进,如果出现链接时间过长,可以更换以下网络,或者尝试更换源。如果还有问题,可以考虑更换一台电脑运行)

    展开全文
  • 手把手教你利用爬虫网页Python代码

    万次阅读 多人点赞 2019-05-14 14:34:48
    本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以...

    640?wx_fmt=jpeg

    本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以便具备编写HTTP网络程序的能力。


    01

    网络爬虫概述


    接下来从网络爬虫的概念、用处与价值和结构等三个方面,让大家对网络爬虫有一个基本的了解。

    1. 网络爬虫及其应用

    随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战,网络爬虫应运而生。网络爬虫(又被称为网页蜘蛛、网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。下面通过图3-1展示一下网络爬虫在互联网中起到的作用:


    640?wx_fmt=png

    ▲图3-1 网络爬虫


    网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

    搜索引擎(Search Engine),例如传统的通用搜索引擎baidu、Yahoo和Google等,是一种大型复杂的网络爬虫,属于通用性网络爬虫的范畴。但是通用性搜索引擎存在着一定的局限性:

    1. 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。

    2. 通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。

    3. 万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。

    4. 通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。

    为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。

    聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择地访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。

    说完了聚焦爬虫,接下来再说一下增量式网络爬虫。增量式网络爬虫是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。

    和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。

    例如:想获取赶集网的招聘信息,以前爬取过的数据没有必要重复爬取,只需要获取更新的招聘数据,这时候就要用到增量式爬虫。

    最后说一下深层网络爬虫。Web页面按存在方式可以分为表层网页和深层网页。表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的Web页面。深层网络是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的Web页面。

    例如用户登录或者注册才能访问的页面。可以想象这样一个场景:爬取贴吧或者论坛中的数据,必须在用户登录后,有权限的情况下才能获取完整的数据。

    2. 网络爬虫结构

    下面用一个通用的网络爬虫结构来说明网络爬虫的基本工作流程,如图3-4所示。


    640?wx_fmt=png

    ▲图3-4 网络爬虫结构

    网络爬虫的基本工作流程如下:

    1. 首先选取一部分精心挑选的种子URL。

    2. 将这些URL放入待抓取URL队列。

    3. 从待抓取URL队列中读取待抓取队列的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。

    4. 分析已抓取URL队列中的URL,从已下载的网页数据中分析出其他URL,并和已抓取的URL进行比较去重,最后将去重过的URL放入待抓取URL队列,从而进入下一个循环。

    02

    HTTP请求的Python实现


    通过上面的网络爬虫结构,我们可以看到读取URL、下载网页是每一个爬虫必备而且关键的功能,这就需要和HTTP请求打交道。接下来讲解Python中实现HTTP请求的三种方式:urllib2/urllib、httplib/urllib以及Requests。

    1. urllib2/urllib实现

    urllib2和urllib是Python中的两个内置模块,要实现HTTP功能,实现方式是以urllib2为主,urllib为辅。

    1.1 首先实现一个完整的请求与响应模型

    urllib2提供一个基础函数urlopen,通过向指定的URL发出请求来获取数据。最简单的形式是:

    
     

    import urllib2
    response=urllib2.urlopen('http://www.zhihu.com')
    html=response.read()
    print html

    其实可以将上面对http://www.zhihu.com的请求响应分为两步,一步是请求,一步是响应,形式如下:

    
     

    import urllib2
    # 请求
    request=urllib2.Request('http://www.zhihu.com')
    # 响应
    response = urllib2.urlopen(request)
    html=response.read()
    print html

    上面这两种形式都是GET请求,接下来演示一下POST请求,其实大同小异,只是增加了请求数据,这时候用到了urllib。示例如下:

    
     

    import urllib
    import urllib2
    url = 'http://www.xxxxxx.com/login'
    postdata = {'username' : 'qiye',
        'password' : 'qiye_pass'}
    # info 需要被编码为urllib2能理解的格式,这里用到的是urllib
    data = urllib.urlencode(postdata)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    html = response.read()

    但是有时会出现这种情况:即使POST请求的数据是对的,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息,服务器会检验请求头,来判断是否是来自浏览器的访问,这也是反爬虫的常用手段。

    1.2 请求头headers处理

    将上面的例子改写一下,加上请求头信息,设置一下请求头中的User-Agent域和Referer域信息。

    
     

    import urllib
    import urllib2
    url = 'http://www.xxxxxx.com/login'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    referer='http://www.xxxxxx.com/'
    postdata = {'username' : 'qiye',
        'password' : 'qiye_pass'}
    # 将user_agent,referer写入头信息
    headers={'User-Agent':user_agent,'Referer':referer}
    data = urllib.urlencode(postdata)
    req = urllib2.Request(url, data,headers)
    response = urllib2.urlopen(req)
    html = response.read()

    也可以这样写,使用add_header来添加请求头信息,修改如下:

    
     

    import urllib
    import urllib2
    url = 'http://www.xxxxxx.com/login'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    referer='http://www.xxxxxx.com/'
    postdata = {'username' : 'qiye',
        'password' : 'qiye_pass'}
    data = urllib.urlencode(postdata)
    req = urllib2.Request(url)
    # 将user_agent,referer写入头信息
    req.add_header('User-Agent',user_agent)
    req.add_header('Referer',referer)
    req.add_data(data)
    response = urllib2.urlopen(req)
    html = response.read()

    对有些header要特别留意,服务器会针对这些header做检查,例如:

    • User-Agent:有些服务器或Proxy会通过该值来判断是否是浏览器发出的请求。

    • Content-Type:在使用REST接口时,服务器会检查该值,用来确定HTTP Body中的内容该怎样解析。在使用服务器提供的RESTful或SOAP服务时,Content-Type设置错误会导致服务器拒绝服务。常见的取值有:application/xml(在XML RPC,如RESTful/SOAP调用时使用)、application/json(在JSON RPC调用时使用)、application/x-www-form-urlencoded(浏览器提交Web表单时使用)。

    • Referer:服务器有时候会检查防盗链。

    1.3 Cookie处理

    urllib2对Cookie的处理也是自动的,使用CookieJar函数进行Cookie的管理。如果需要得到某个Cookie项的值,可以这么做:

    
     

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

    但是有时候会遇到这种情况,我们不想让urllib2自动处理,我们想自己添加Cookie的内容,可以通过设置请求头中的Cookie域来做:

    
     

    import  urllib2
    opener = urllib2.build_opener()
    opener.addheaders.append( ( 'Cookie''email=' + "xxxxxxx@163.com" ) )
    req = urllib2.Request( "http://www.zhihu.com/" )
    response = opener.open(req)
    print response.headers
    retdata = response.read()

    1.4 Timeout设置超时

    在Python2.6之前的版本,urllib2的API并没有暴露Timeout的设置,要设置Timeout值,只能更改Socket的全局Timeout值。示例如下:

    
     

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

    在Python2.6及新的版本中,urlopen函数提供了对Timeout的设置,示例如下:

    
     

    import urllib2
    request=urllib2.Request('http://www.zhihu.com')
    response = urllib2.urlopen(request,timeout=2)
    html=response.read()
    print html

    1.5 获取HTTP响应码

    对于200 OK来说,只要使用urlopen返回的response对象的getcode()方法就可以得到HTTP的返回码。但对其他返回码来说,urlopen会抛出异常。这时候,就要检查异常对象的code属性了,示例如下:

    
     

    import urllib2
    try:
        response = urllib2.urlopen('http://www.google.com')
        print response
    except urllib2.HTTPError as e:
        if hasattr(e, 'code'):
            print 'Error code:',e.code

    1.6 重定向

    urllib2默认情况下会针对HTTP 3XX返回码自动进行重定向动作。要检测是否发生了重定向动作,只要检查一下Response的URL和Request的URL是否一致就可以了,示例如下:

    
     

    import urllib2
    response = urllib2.urlopen('http://www.zhihu.cn')
    isRedirected = response.geturl() == 'http://www.zhihu.cn'

    如果不想自动重定向,可以自定义HTTPRedirectHandler类,示例如下:

    
     

    import urllib2
    class RedirectHandler(urllib2.HTTPRedirectHandler):
        def http_error_301(self, req, fp, code, msg, headers):
            pass
        def http_error_302(self, req, fp, code, msg, headers):
            result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, 
            msg, headers)
            result.status = code
            result.newurl = result.geturl()
            return result
    opener = urllib2.build_opener(RedirectHandler)
    opener.open('http://www.zhihu.cn')

    1.7 Proxy的设置

    在做爬虫开发中,必不可少地会用到代理。urllib2默认会使用环境变量http_proxy来设置HTTP Proxy。但是我们一般不采用这种方式,而是使用ProxyHandler在程序中动态设置代理,示例代码如下:

    
     

    import urllib2
    proxy = urllib2.ProxyHandler({'http''127.0.0.1:8087'})
    opener = urllib2.build_opener([proxy,])
    urllib2.install_opener(opener)
    response = urllib2.urlopen('http://www.zhihu.com/')
    print response.read()

    这里要注意的一个细节,使用urllib2.install_opener()会设置urllib2的全局opener,之后所有的HTTP访问都会使用这个代理。这样使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的Proxy设置,这种场景在爬虫中很常见。比较好的做法是不使用install_opener去更改全局的设置,而只是直接调用opener的open方法代替全局的urlopen方法,修改如下:

    
     

    import urllib2
    proxy = urllib2.ProxyHandler({'http''127.0.0.1:8087'})
    opener = urllib2.build_opener(proxy,)
    response = opener.open("http://www.zhihu.com/")
    print response.read()


    2. httplib/urllib实现

    httplib模块是一个底层基础模块,可以看到建立HTTP请求的每一步,但是实现的功能比较少,正常情况下比较少用到。在Python爬虫开发中基本上用不到,所以在此只是进行一下知识普及。下面介绍一下常用的对象和函数:


    • 创建HTTPConnection对象:

      class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])。

    • 发送请求:

      HTTPConnection.request(method, url[, body[, headers]])。

    • 获得响应:

      HTTPConnection.getresponse()。

    • 读取响应信息:

      HTTPResponse.read([amt])。

    • 获得指定头信息:

      HTTPResponse.getheader(name[, default])。

    • 获得响应头(header, value)元组的列表:

      HTTPResponse.getheaders()。

    • 获得底层socket文件描述符:

      HTTPResponse.fileno()。

    • 获得头内容:

      HTTPResponse.msg。

    • 获得头http版本:

      HTTPResponse.version。

    • 获得返回状态码:

      HTTPResponse.status。

    • 获得返回说明:

      HTTPResponse.reason。

    接下来演示一下GET请求和POST请求的发送,首先是GET请求的示例,如下所示:

    
     

    import httplib
    conn =None
    try:
        conn = httplib.HTTPConnection("www.zhihu.com")
        conn.request("GET""/")
        response = conn.getresponse()
        print response.status, response.reason
        print '-' * 40
        headers = response.getheaders()
        for h in headers:
            print h
        print '-' * 40
        print response.msg
    except Exception,e:
        print e
    finally:
        if conn:
            conn.close()

    POST请求的示例如下:

    
     

    import httplib, urllib
    conn = None
    try:
        params = urllib.urlencode({'name''qiye''age'22})
        headers = {"Content-type""application/x-www-form-urlencoded"
        , "Accept""text/plain"}
        conn = httplib.HTTPConnection("www.zhihu.com"80, timeout=3)
        conn.request("POST""/login", params, headers)
        response = conn.getresponse()
        print response.getheaders() # 获取头信息
        print response.status
        print response.read()
    except Exception, e:
        print e
        finally:
        if conn:
            conn.close()

    3. 更人性化的Requests

    Python中Requests实现HTTP请求的方式,是本人极力推荐的,也是在Python爬虫开发中最为常用的方式。Requests实现HTTP请求非常简单,操作更加人性化。

    Requests库是第三方模块,需要额外进行安装。Requests是一个开源库,源码位于:

    GitHub: https://github.com/kennethreitz/requests

    希望大家多多支持作者。

    使用Requests库需要先进行安装,一般有两种安装方式:

    • 使用pip进行安装,安装命令为:pip install requests,不过可能不是最新版。

    • 直接到GitHub上下载Requests的源代码,下载链接为:

      https://github.com/kennethreitz/requests/releases

      将源代码压缩包进行解压,然后进入解压后的文件夹,运行setup.py文件即可。

    如何验证Requests模块安装是否成功呢?在Python的shell中输入import requests,如果不报错,则是安装成功。如图3-5所示。

    640?wx_fmt=png

    ▲图3-5 验证Requests安装

    3.1 首先还是实现一个完整的请求与响应模型

    以GET请求为例,最简单的形式如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    print r.content

    大家可以看到比urllib2实现方式的代码量少。接下来演示一下POST请求,同样是非常简短,更加具有Python风格。示例如下:

    
     

    import requests
    postdata={'key':'value'}
    r = requests.post('http://www.xxxxxx.com/login',data=postdata)
    print r.content

    HTTP中的其他请求方式也可以用Requests来实现,示例如下:

    
     

    r = requests.put('http://www.xxxxxx.com/put', data = {'key':'value'})
    r = requests.delete('http://www.xxxxxx.com/delete')
    r = requests.head('http://www.xxxxxx.com/get')
    r = requests.options('http://www.xxxxxx.com/get')

    接着讲解一下稍微复杂的方式,大家肯定见过类似这样的URL:

    http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1

    就是在网址后面紧跟着“?”,“?”后面还有参数。那么这样的GET请求该如何发送呢?肯定有人会说,直接将完整的URL带入即可,不过Requests还提供了其他方式,示例如下:

    
     

    import requests
        payload = {'Keywords''blog:qiyeboy','pageindex':1}
    r = requests.get('http://zzk.cnblogs.com/s/blogpost', params=payload)
    print r.url

    通过打印结果,我们看到最终的URL变成了:

    http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1

    3.2 响应与编码

    还是从代码入手,示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    print 'content-->'+r.content
    print 'text-->'+r.text
    print 'encoding-->'+r.encoding
    r.encoding='utf-8'
    print 'new text-->'+r.text

    其中r.content返回的是字节形式,r.text返回的是文本形式,r.encoding返回的是根据HTTP头猜测的网页编码格式。

    输出结果中:“text-->”之后的内容在控制台看到的是乱码,“encoding-->”之后的内容是ISO-8859-1(实际上的编码格式是UTF-8),由于Requests猜测编码错误,导致解析文本出现了乱码。Requests提供了解决方案,可以自行设置编码格式,r.encoding='utf-8'设置成UTF-8之后,“new text-->”的内容就不会出现乱码。

    但是这种手动的方式略显笨拙,下面提供一种更加简便的方式:chardet,这是一个非常优秀的字符串/文件编码检测模块。安装方式如下:

    
     

    pip install chardet

    安装完成后,使用chardet.detect()返回字典,其中confidence是检测精确度,encoding是编码形式。示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    print chardet.detect(r.content)
    r.encoding = chardet.detect(r.content)['encoding']
    print r.text

    直接将chardet探测到的编码,赋给r.encoding实现解码,r.text输出就不会有乱码了。

    除了上面那种直接获取全部响应的方式,还有一种流模式,示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com',stream=True)
    print r.raw.read(10)

    设置stream=True标志位,使响应以字节流方式进行读取,r.raw.read函数指定读取的字节数。

    3.3 请求头headers处理

    Requests对headers的处理和urllib2非常相似,在Requests的get函数中添加headers参数即可。示例如下:

    
     

    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    r = requests.get('http://www.baidu.com',headers=headers)
    print r.content

    3.4 响应码code和响应头headers处理

    获取响应码是使用Requests中的status_code字段,获取响应头使用Requests中的headers字段。示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    if r.status_code == requests.codes.ok:
        print r.status_code# 响应码
        print r.headers# 响应头
        print r.headers.get('content-type')# 推荐使用这种获取方式,获取其中的某个字段
        print r.headers['content-type']# 不推荐使用这种获取方式
    else:
        r.raise_for_status()

    上述程序中,r.headers包含所有的响应头信息,可以通过get函数获取其中的某一个字段,也可以通过字典引用的方式获取字典值,但是不推荐,因为如果字段中没有这个字段,第二种方式会抛出异常,第一种方式会返回None。

    r.raise_for_status()是用来主动地产生一个异常,当响应码是4XX或5XX时,raise_for_status()函数会抛出异常,而响应码为200时,raise_for_status()函数返回None。

    3.5 Cookie处理

    如果响应中包含Cookie的值,可以如下方式获取Cookie字段的值,示例如下:

    
     

    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    r = requests.get('http://www.baidu.com',headers=headers)
    # 遍历出所有的cookie字段的值
    for cookie in r.cookies.keys():
        print cookie+':'+r.cookies.get(cookie)

    如果想自定义Cookie值发送出去,可以使用以下方式,示例如下:

    
     

    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    cookies = dict(name='qiye',age='10')
    r = requests.get('http://www.baidu.com',headers=headers,cookies=cookies)
    print r.text

    还有一种更加高级,且能自动处理Cookie的方式,有时候我们不需要关心Cookie值是多少,只是希望每次访问的时候,程序自动把Cookie的值带上,像浏览器一样。Requests提供了一个session的概念,在连续访问网页,处理登录跳转时特别方便,不需要关注具体细节。使用方法示例如下:

    
     

    import Requests
    oginUrl = 'http://www.xxxxxxx.com/login'
    s = requests.Session()
    #首先访问登录界面,作为游客,服务器会先分配一个cookie
    r = s.get(loginUrl,allow_redirects=True)
    datas={'name':'qiye','passwd':'qiye'}
    #向登录链接发送post请求,验证成功,游客权限转为会员权限
    r = s.post(loginUrl, data=datas,allow_redirects= True)
    print r.text

    上面的这段程序,其实是正式做Python开发中遇到的问题,如果没有第一步访问登录的页面,而是直接向登录链接发送Post请求,系统会把你当做非法用户,因为访问登录界面时会分配一个Cookie,需要将这个Cookie在发送Post请求时带上,这种使用Session函数处理Cookie的方式之后会很常用。

    3.6 重定向与历史信息

    处理重定向只是需要设置一下allow_redirects字段即可,例如:

    r=requests.get('http://www.baidu.com',allow_redirects=True)

    将allow_redirects设置为True,则是允许重定向;设置为False,则是禁止重定向。如果是允许重定向,可以通过r.history字段查看历史信息,即访问成功之前的所有请求跳转信息。示例如下:

    
     

    import requests
    r = requests.get('http://github.com')
    print r.url
    print r.status_code
    print r.history

    打印结果如下:

    
     

    https://github.com/
    200
    (<Response [301]>,)

    上面的示例代码显示的效果是访问GitHub网址时,会将所有的HTTP请求全部重定向为HTTPS。

    3.7 超时设置

    超时选项是通过参数timeout来进行设置的,示例如下:

    
     

    requests.get('http://github.com', timeout=2)

    3.8 代理设置

    使用代理Proxy,你可以为任意请求方法通过设置proxies参数来配置单个请求:

    
     

    import requests
    proxies = {
        "http""http://0.10.1.10:3128",
        "https""http://10.10.1.10:1080",
    }
    requests.get("http://example.org", proxies=proxies)

    也可以通过环境变量HTTP_PROXY和HTTPS_PROXY?来配置代理,但是在爬虫开发中不常用。你的代理需要使用HTTP Basic Auth,可以使用http://user:password@host/语法:

    
     

    proxies = {
        "http""http://user:pass@10.10.1.10:3128/",
    }


    03

    小结


    本文主要讲解了网络爬虫的结构和应用,以及Python实现HTTP请求的几种方法。希望大家对本文中的网络爬虫工作流程和Requests实现HTTP请求的方式重点吸收消化。

    本文摘编自《Python爬虫开发与项目实战》,经出版方授权发布。

    关于作者:范传辉,资深网虫,Python开发者,参与开发了多项网络应用,在实际开发中积累了丰富的实战经验,并善于总结,贡献了多篇技术文章广受好评。研究兴趣是网络安全、爬虫技术、数据分析、驱动开发等技术。

    640?wx_fmt=jpeg

    Python爬虫开发与项目实战

    扫码购买

    640?wx_fmt=png


    本书特色:

    • 由浅入深,从Python和Web前端基础开始讲起,逐步加深难度,层层递进。

    • 内容详实,从静态网站到动态网站,从单机爬虫到分布式爬虫,既包含基础知识点,又讲解了关键问题和难点分析,方便读者完成进阶。

    • 实用性强,本书共有9个爬虫项目,以系统的实战项目为驱动,由浅及深地讲解爬虫开发中所需的知识和技能。

    • 难点详析,对js加密的分析、反爬虫措施的突破、去重方案的设计、分布式爬虫的开发进行了细致的讲解。

    扫码购买

    640?wx_fmt=png

    展开全文
  • python爬虫:爬取动态生成的DOM节点渲染数据结果,该方式不是直接拿到接口进行解析,而是XHR中看不到数据,检查网页又能看到,普通爬虫爬取下来的结果是看不到爬取到的这个数据所在的div的。
  • 这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片。 用到的包: urllib....
  • 主要介绍了Python3简单爬虫抓取网页图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request.urlopen(url).read() return html print(getHtml(http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=壁纸&...
  • 本文主要介绍了Python爬虫:通过关键字爬取百度图片的方法。具有很好的参考价值,下面跟着小编一起来看下吧
  • 博文来自:zhang740000的博客Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有所耳闻,会觉得是一个高大上的东西,仿佛九阳神功和乾坤大挪移一样,和别人说“老子会爬虫”,就感觉特别有逼格,...

    在开始制作爬虫前,我们应该做好前期准备工作,找到要爬的网站,然后查看它的源代码我们这次爬豆瓣美女网站,网址为:用到的工具:pycharm,这是它的图标 ...博文来自:zhang740000的博客

    Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有所耳闻,会觉得是一个高大上的东西,仿佛九阳神功和乾坤大挪移一样,和别人说“老子会爬虫”,就感觉特别有逼格,但是又不知从何入手,...博文来自:夏洛克江户川

    互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码经过浏览器解析、渲染,将丰富多彩的网页呈现我们眼前。网络爬虫,也叫网络蜘蛛(We...博文来自:阎松的博客

    从链家网站爬虫石家庄符合条件的房源信息,并保存到文件,房源信息包括名称、建筑面积、总价、所在区域、套内面积等。其中所在区域、套内面积需要在详情页获取计算。主要使用了requests+Beautiful...博文

    ###写在题外的话爬虫,我还是大三的时候,第一次听说,当时我的学姐给我找的一个勤工俭学的项目,要求是在微博上爬出感兴趣的信息,结果很遗憾,第一次邂逅只是擦肩而过。然后,时间来到4年后的研二,在做信息检...博文来自:wsbxzz1的专栏

    WechatSogou [1]-微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。 DouBanSpider [2]-豆...博文来自:perry_Fan

    5分钟,6行代码教你写会爬虫!适用人士:对数据量需求不大,简单的从网站上爬些数据。好,不浪费时间了,开始!先来个例子:输入以下代码(共6行)importrequestsfromlxmlimportht...博文来自:程松

    前几天,刘若英的《后来》电影版——《后来的我们》上映了,我身边也有小伙伴去看了,问了之后,他们说其实这个电影对没有多少故事的我们代入感不够强,我没去看,一是因为单身狗一只,去电影院看电影纯属找虐,另一...博文来自:weixin_41032076的博客

    本篇是在学习Python基础知识之后的一次小小尝试,这次将会爬取熊猫TV网页上的王者荣耀主播排名,在不借助第三方框架的情况下演示一个爬虫的原理。一、实现Python爬虫的思路第一步:明确目的1.找到想...博文来自:梧雨北辰的博客

    问题的由来  前几天,在微信公众号(Python爬虫及算法)上有个人问了笔者一个问题,如何利用爬虫来实现如下的需求,需要爬取的网页如下(网址为:博文来自:但盼风雨来

    首先要导入模块,然后输入需要爬虫的网址,接着打开一个文件(接收器)然后将网址中的东西缓冲到你的接收器中这样就可以实现简单的爬虫fromurllibimportrequestr=request.urlo...博文来自:xuanyugang的博客

    爬虫是封装在WebCrawler类中的,Test.py调用爬虫的craw函数达到下载网页的功能。运用的算法:广度遍历关于网络爬虫的详细信息请参考百度百科 Test.py----------------...博文来自:Cashey1991的专栏

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门。不过不要慌...博文来自:weixin_34252090的博客

    来源:程序猿本文长度为2863字,建议阅读5分钟本文为你分享零基础开始写爬虫的经验。刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构...博文来自:THU数据派

    概述:      第一次接触爬虫,从简单一点的爬取百度图片开始,话不多说,直接上手。前期准备:     首先要配置环境,这里使用到的是requests第三方库,相比Beautifulsoup而言req...博文来自:heart__gx的博客

    1、任务简介前段时间一直在学习Python基础知识,故未更新博客,近段时间学习了一些关于爬虫的知识,我会分为多篇博客对所学知识进行更新,今天分享的是获取指定网页源码的方法,只有将网页源码抓取下来才能从...博文来自:罗思洋的博客

    对职友集招聘网站的爬虫一、对职友集的python爬虫代码如下:输出结果:headers错误信息处理一、对职友集的python爬虫学习python那就要对自己将来的工作有一个研究,现在就来看看,职友集上...博文来自:Prodigal

    最近学习了一下python的基础知识,大家一般对“爬虫”这个词,一听就比较熟悉,都知道是爬一些网站上的数据,然后做一些操作整理,得到人们想要的数据,但是怎么写一个爬虫程序代码呢?相信很多人是不会的,今...博文来自:rmkloveme

    爬虫:爬取全书网,获取数据,存到数据库工具:mysql,python3,MySQLdb模块:requests(pipinstallrequests),re(不需要安装)网址:博文来自:乐亦亦乐的博客

    python作为人工智能或者大数据的宠儿,我自然要学习,作为一个小白,第一个实现的工能就是爬虫,爬数据,收集数据,我以我爬csdn博客的事情为例子,附上代码,大家一起学习这里还使用了ip代理基数,一起...博文来自:Mr小颜同学的博客

    环境:Windows7+python3.6+Pycharm2017目标:抓取京东商品列表页面信息:售价、评论数、商品名称-----以手机为例---全部文章:京东爬虫、链家爬虫、美团爬虫、微信公众号爬虫...博文来自:老王の博客

    本文介绍两种爬取方式:1.正则表达式2.bs4解析Html以下为正则表达式爬虫,面向对象封装后的代码如下:以下为使用bs4爬取的代码:bs4面向对象封装后代码:......博文来自:python学习者的博客

    2018年3月27日,继开学以来,开了软件工程和信息系统设计,想来想去也没什么好的题目,干脆就想弄一个实用点的,于是产生了做“学生服务系统”想法。相信各大高校应该都有本校APP或超级课程表之类的...博文来自:跬步至以千里的博客

    本文参考IMMOC中的python”开发简单爬虫“:。如果不足,希望指正本文为原创,转载请注明出处:博文来自:014技术仓库

    python小白群交流:861480019手机电脑挂机挣零钱群:一毛一毛赚  903271585(每天手机登录然后不用管,一天有不到一块钱的收入,大部分软件可以一块钱提现一次)注意,申请时说明加入原因...博文来自:chq1005613740的博客

    (一)百度贴吧帖子用户与评论信息(二)豆瓣登录脚本 博文来自:PANGHAIFEI的博客

    文章地址:在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁...博文来自:不如补钙的博客

    大数据下的简单网络爬虫使用代码进行实现(本博文对京东网站的某手机的评论进行爬取)...博文来自:data_bug的博客

    以下总结的全是单机爬取的应对反爬策略 1、设置爬取速度,由于爬虫发送请求的速度比较快,会对服务器造成一定的影响,尽可能控制爬取速度,做到文明爬取2、重启路由器。并不是指物理上的插拔路由器,而是指模拟路...博文来自:菜到怀疑人生的博客

    之前打算爬取一个图片资源网站,但是在翻页时发现它的url并没有改变,无法简单的通过request.get()访问其他页面。据搜索资料,了解到这些网站是通过ajax动态加载技术实现。即可以在不重新加载整...博文来自:c350577169的博客

    Python开发爬虫完整代码解析 移除python​三天时间,总算开发完了。说道爬虫,我觉得有几个东西需要特别注意,一个是队列,告诉程序,有哪些url要爬,第二个就是爬页面,肯定有元素缺失的,这个究其...博文来自:大壮的博客

    这段时间公司要求抓全国的一类网站,网站虽然都是一类的,但是结构也是各有不同,目前是抓了几十个上百个测试,我使用的是scrapy多爬虫爬取,感觉也不是特别好,所以在寻找更好的方法或者框架,看看有没有一些论坛

    本文主要涵盖了Python编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章)。首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合...博文来自:的博客

    本文来自: 老铁博客,转载请保留出处!欢迎发表您的评论

    相关标签:爬虫代码

    展开全文
  • Python3爬虫抓取百度图片中的图片,可根据需求输入关键字、图片数量
  • 实例如下所示: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib.request import urlretrieve class Picture(): def __init__(self): self.headers = {'User-...
  • 超详细图片爬虫实战实例讲解(京东商城手机图片爬取)1.创建一个文件夹来存放你爬取的图片2.第一部分代码分析3.第二部分代码分析完整的代码如下所示:升级版代码: 爬取过程中首先你需要观察在手机页面变化的过程来使用...
  • 利用python抓取网络图片的步骤: 1.根据给定的网址获取网页代码 2.利用正则表达式把源代码中的图片地址过滤出来 3.根据过滤出来的图片地址下载网络图片
  • 参考书籍:《用 Python 写网络...下载一个网页代码最简单的形式使用的是 python 自带的库 urllib2import urllib2def download(url):print "downloading " , urlhtml = urllib2.urlopen(url).read()retu...

    参考书籍:《用 Python 写网络爬虫》

    当然你也可以自己百度搜索下载。

    一点感想

    书看一遍是不够的,温故而知新。

    下载一个网页源代码

    最简单的形式

    使用的是 python 自带的库 urllib2

    import urllib2

    def download(url):

    print "downloading " , url

    html = urllib2.urlopen(url).read()

    return html

    给定想要下载的 URL 即可下载其源代码。

    添加处理异常的功能

    当然很有可能在下载的过程中出现各种问题,导致出现问题,所以需要在上面的程序上扩展,处理异常的情况。

    import urllib2

    def download(url):

    print "downloading " , url

    try:

    html = urllib2.urlopen(url).read()

    except urllib2.URLErrors as e:

    print "download error: " , e.reason

    html = None

    return html

    完整的程序如下:

    # _*_ encoding:utf-8 _*_

    '''

    Created on 2017年8月4日

    @author: wangs0622

    '''

    import urllib2

    def download(url):

    print "downloading " , url

    try:

    html = urllib2.urlopen(url).read()

    except urllib2.URLError as e:

    print "download error: " , e.reason

    html = None

    return html

    if __name__ == '__main__':

    download('http://www.wangs0622.com/dex')

    运行的结果如下:

    downloading http://www.wangs0622.com/dex

    download error: Not Found

    添加重试下载功能

    有的时候,下载出现了问题,可能是但是网络不好的原因,也有可能是页面不存在的原因,一般会返回 4xx 和 5xx 类型的错误代码。 最常见的莫过于 404,即表示网页未找到。(为什么网页为找到,使用的是 404 代码呢? 据说是有历史原因的,有兴趣的话可以去百度。)

    正常情况下,返回 5xx 错误代码的话,是因为网络的原因,并不是网页不存在,这个时候,我们可以尝试重新下载这个网页,所以,就有了如下的改进版本。

    import urllib2

    def download(url, num_retries = 5):

    '''

    function: 下载网页源代码,如果遇到 5xx 错误状态,则继续尝试下载,知道下载 5 次为止。

    '''

    print "downloading " , url

    try:

    html = urllib2.urlopen(url).read()

    except urllib2.URLError as e:

    print "download error: " , e.reason

    html = None

    if num_retries > 0:

    if hasattr(e,'code') and 500 <= e.code < 600:

    return download(url, num_retries-1)

    return html

    一个有用的网站

    小结

    截止目前的 download() 函数已经具备健全的下载网页源代码的功能,可以应付一般情况下的使用了。

    后面还需要介绍为 download() 函数添加代理和下载延时功能,之后再介绍 链接爬虫。我想法是在介绍这些功能的同时我们实践爬取一个网站。相信学爬虫的都是广大男士,后面实践爬取的网站是:http://www.mm131.com 我们的目标是将其中的图片下载下来。

    展开全文
  • 主要介绍了Python实现简单网页图片抓取完整代码实例,具有一定借鉴价值,需要的朋友可以参考下。
  • python抓取网站图片并放到指定文件夹 复制代码 代码如下:# -*- coding=utf-8 -*-import urllib2import urllibimport socketimport osimport redef Docment(): print u’把文件存在E:\Python\图(请输入数字或字母)...
  • 复制代码 代码如下:#-*- encoding: utf-8 -*-”’Created on 2014-4-24 @author: Leon Wong”’ import urllib2import urllibimport reimport timeimport osimport uuid #获取二级页面urldef findUrl2(html): re1 =...
  • #定义一个爬虫 ...#getsource用来获取网页代码 def getsource(self,url): html = requests.get(url) return html.text #changepage用来生产不同页数的链接 def changepage(self,url,total_p
  • 这段时间一直在学习Python的东西,以前就听说Python爬虫多厉害,正好现在学到这里,跟着小甲鱼的Python视频写了一个爬虫程序,能实现简单的网页图片下载。 二、代码 __author__ = JentZhang import urllib.request ...
  • 相信各位在写 python 爬虫的时候会在爬取网站时遇到一些登陆的问题,比如说登陆时遇到输入验证码比如说登录时遇到图片拖拽等验证,如何解决这类问题呢?一般有两种方案。 使用 cookie 登陆 我们可以通过使用 cookies...
  • Python 爬虫 之 根据图片网址爬取图片

    千次阅读 多人点赞 2020-02-07 21:17:18
    Python 爬虫 之 根据图片网址爬取图片 目录 Python 爬虫 之 根据图片网址爬取图片 一、简单介绍 二、实现原理 三、注意实现 四、实现步骤 五、关键代码 一、简单介绍 Python是一种跨平台的计算机程序...
  • 本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以便具备编写HTTP网络程序的能力。01网络爬虫概述接下来...
  • 最近几天,研究了一下一直很好奇的爬虫算法。这里写一下最近几天的点点心得。下面进入正文:你可能需要的工作环境:我们这里以sogou作为爬取的对象。首先我们进入搜狗图片http://pic.sogou.com/,进入壁纸分类(当然...
  • Python爬虫(三):python抓取网页中的图片到本地

    万次阅读 多人点赞 2018-11-28 16:25:28
    接上一篇文章:Python爬虫(二):爬虫获取数据保存到文件 简介: python3抓取网页中的图片到本地的过程如下: 1、抓取网页 2、获取图片地址 3、抓取图片内容并保存到本地 实例: 抓取 豆瓣电影top250 中的...
  • python爬虫手把手教你抓取微博评论(完整代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,065
精华内容 8,826
关键字:

python爬虫网页图片代码

python 订阅
爬虫 订阅