零基础爬取堆糖网图片(二)---多线程版

微信图片_20200417222718.jpg

全文介绍:

接着上篇文章,我们已经实现图片的下载,但是我们发现整个爬取过程中,因为使用了for循环嵌套,导致每次遍历,都会打开文件在关闭,打开文件在关闭(套娃)。所以需要注意for循环的使用,其次下载图片是整个程序中最耗时的,如果需要提升爬取速度,那么我们可以从这个方向入手,实现多线程爬取

涉及内容:

  1. 爬虫基本流程
  2. requests库基本使用
  3. urllib.parse模块
  4. threading模块

图例说明:

  1. 请求与响应
sequenceDiagram
浏览器->>服务器: 请求
服务器-->>浏览器: 响应
  1. 爬虫基本流程
graph TD
A[目标网站] -->|分析网站| B(url)
B --> C[模拟浏览器请求资源]
C -->D[解析网页]
D-->E[保存数据]

正文:

1.导入

import urllib.parse
import threading
import requests

2.发送请求,获取响应

def get_page(url):
    page = requests.get(url)
    page = page.content
    # 将 bytes 转化为 字符串
    page = page.decode('utf-8')

    return page

3.关键字以及翻页

def pages_from_duitang(label):
    url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}'
    pages = []
    # 将中文转化成url编码
    label = urllib.parse.quote(label)
    # 0-3600 步长100
    for index in range(0, 3600, 100):
        # 将这两个变量替换占位符{}
        u = url.format(label, index)
        print(u)
        page = get_page(u)
        pages.append(page)
    return pages

4.获取一个页面上的所有图片子链接

def findall_pages(page, startpart, endpart):
    all_string = []
    end = 0
    # -1代表找不到 意思就是匹配到就执行循环
    while page.find(startpart, end) != -1:
        # 匹配第一个字符,从下标0开始匹配到的位置下标,并将字符长短传给start变量
        start = page.find(startpart, end) + len(startpart)
        # 将从第一个需要匹配的字符串后面的字符开始,匹配第二个需要匹配的字符出现的位置,并将这个下标值赋给end变量
        end = page.find(endpart, start)
        # 切片 取两个所要匹配字符 之间的部分也就是图片url
        string = page[start:end]
        # 存入列表
        all_string.append(string)
    return all_string

5.爬取全部页面

def pic_url_from_pages(pages):
    pic_url = []
    for page in pages:
        url = findall_pages(page, 'path":"', '"')
        pic_url.extend(url)     # 合并列表
    return pic_url

6.下载图片

def pic_download(url, n):
    r = requests.get(url)
    path = r"C:\Users\Mark\Desktop\新建文件夹 (2)\%s.jpg" %n
    with open(path, 'wb')as d:
        d.write(r.content)

7.调用函数

之前的函数就像是一个一个的零件,现在我们要拼装这些零件,这个车才开的起来!😏

def main(label):
    pages = pages_from_duitang(label)
    pic_url = pic_url_from_pages(pages)
    n = 0
    for url in pic_url:
        n += 1
        print('正在下载第 {} 张图片'.format(n))
        pic_download(url,n)
        
main('校花')

已完成

  • 函数封装
  • 多线程

8.多线程的实现

栗子来了

排队上厕所:商城经常会有人排队上厕所,而一个厕所(进程)是可以有多个坑位(线程),每当有位置空着时就会有下一个人进来,进来后为了让别人知道这个位置有人了(避免争夺),避免尴尬,需要上锁,完事儿,出来时解锁就行,然后再有一个人进来......

1587388722298.png
  1. 首先设置信号量
thread_lock = threading.BoundedSemaphore(value=5)   # value 可以改,但不可过大
  1. 然后就是主函数中对于下载图片这个函数使用多线程
def main(label):
    pages = pages_from_duitang(label)
    pic_url = pic_url_from_pages(pages)
    n = 0
    for url in pic_url:
        n += 1
        print('正在下载第 {} 张图片'.format(n))
        # 上锁
        thread_lock.acquire()
        ## 下载 这个方法丢进线程池
        t = threading.Thread(target=pic_download, args=(url, n))
        t.start()
        pic_download(url,n)

        
main('英雄联盟')
  1. 图片下载完毕,需要解锁
thread_lock.release()

效果:

image

注意身体,就不放过多的正能量图片了

微信图片_20200417223207.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容