爬取表情包

发布时间:2019-05-17 22:07:04编辑:auto阅读(2367)

      这是我第一次在这写博客,还是有点兴奋。

      我也是刚接触Python不久,发现Python代码真的很强大,简单就可以处理复杂的事。最近很想写个爬虫,但水平没达到,正好CSDN学院有个公开课,黄勇老师讲的《90分钟掌握Python多线程爬虫(全程实战)》,3月6日晚20:00我听了直播,当时没跟上,等看了回播才搞明白(可能我是Python2课里是Python3,找理由O(∩_∩)O哈哈~)。

      先上笔记:

    爬虫的流程分析:

    1、请求数据:requests库(这个库可以很方便的去请求网络数据)
    *安装方法:pip install requests
    2、将请求下来的数据解析出来,获取我们想要的数据,把不想要的数据抛弃掉
    *Beautifulsoup:pip install bs4
    *lxml:pip install lxml
    3、将解析后的数据保存下来,如果是文字类型,可以保存到文件中或者数据库中或者缓存中,如果是文件类型,比如图片、视频,那么可以保存到硬盘中
    4、无论你的爬虫是大还是小,都是由这几个模块组成的。

    在此感谢黄勇老师,也不啰嗦了,直接上代码。

    #coding:utf-8
    import requests
    import os
    from bs4 import BeautifulSoup
    import urllib
    import threading
    # 首先要进行身份伪装
    Headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36'}
    PAGE_URLS=[]
    IMG_URLS=[]#全局变量IMG_URLS:就是一个列表,这个列表存储了很多表情包的链接
    gLock=threading.Lock()
    def producer():
        '''生产者:专门用来从网站获取表情包的url链接,相当于增加IMG_URLS中的数据'''
        while True:
            gLock.acquire()#多线程对全局变量操作必须加锁
            if len(PAGE_URLS)==0:
                gLock.release()#跳出循环退出程序前也必须解锁
                break
            page_url=PAGE_URLS.pop()#pop函数将列表中最后一项删除,并返回删除的项
            gLock.release()#操作完成记得解锁
            response = requests.get(page_url, Headers)#获取网页数据,返回response
            text = response.text
            # print text
            soup = BeautifulSoup(text, 'lxml')#实例BeautifulSoup对象解析数据,使用lxml引擎。当然还可以用其他解析工具,也可用正则表达式,正则表达式比较复杂
            img_list = soup.find_all("img", attrs={"class": "img-responsive lazy image_dta"})#根据标签属性查找自己想要的数据,抛弃其它非表情包图片
            for img in img_list:
                img_url = img['data-original']#找到图片源网址,img['src']不是真正的图片源,网址都是一样
                gLock.acquire()
                IMG_URLS.append(img_url)
                gLock.release()
    
    def consumer():
        '''消费者:专门从表情包的url链接中下载图片,相当于消耗IMG_URLS中的数据'''
        while True:
            gLock.acquire()
            if len(IMG_URLS)==0 and len(PAGE_URLS)==0:#刚运行有可能IMG_URLS为空,所以加上PAGE_URLS同时为空才是结束条件
                gLock.release()
                break
            if len(IMG_URLS)>0:
                img_url=IMG_URLS.pop()#为空时pop出错
            else:
                img_url=''
            gLock.release()
            if img_url:
                filename = img_url.split("/")[-1]#将图片地址分割成列表,取最后一项文件名
                fullpath = os.path.join("images", filename)#将images目录名与文件名合并,由于系统不同,不一定就是加"/"
                try:
                    urllib.urlretrieve(img_url, fullpath)#urlretrieve函数就是从目标网址下载存储到本地,Python3中在request库中
                    # print img_url,"下载完成"
                except Exception as e:
                    print e
                    print img_url,"下载失败"#还时常出现10054错误,可能是服务器发现了爬虫强行关闭当前链接
    
    def main():
        for x in range(1,100):#爬取1-99页数据
            page_url="https://www.doutula.com/photo/list/?page="+str(x)
            PAGE_URLS.append(page_url)
        for x in range(5):#开启5个生产者线程
            th=threading.Thread(target=producer)
            th.start()
        for x in range(5):#开启5个消费者线程
            th =threading.Thread(target=consumer)
            th.start()
    if __name__ == '__main__':#如果作为程序则执行,如果作为包加载则不执行
        main()

     

关键字