爬取表情包

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

  我也是刚接触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()

猜你喜欢

转载自www.cnblogs.com/hua1121/p/10509846.html