2019-05-02-重学Python17--下载斗图网-多线程成功-版本03

1,首先,就开了两个线程,下载速度超级快,不知道是不是网速的原因。
2,q.put(),不能传入两个值的问题,我解决了。我把两个值装进一个字典当中即可。
然后从字典当中提取出两个值就可以了!就这么一个小小的思路,让我成功了。
3,图片360张,只能下载成功330张。目前尚不清楚该如何优化,这个版本就先发布了。
4,用的是queue队列模块。看的是老男孩的教程,非常详细容易懂,收货非常大!

'''
1,http://www.doutula.com/article/list/?page=2
2,网站几乎没有任何反爬虫限制机制,加一个header就可以爬取,很easy。
3,但是有个问题,程序有时候运行的很快,只需要1.4s。有时候非常慢,需要95s,不知道是什么原因。。。
百度了一下,爬虫最快1.4s就爬取了,说明不是我爬虫问题。是网络方面问题。
结果,到后期,反而没办法爬取数据了!是反爬机制?还是什么原因???

4,访问的话,隔一段时间勉强还能用。但是下载图片就不行了,明显提示我:urllib.error.HTTPError: HTTP Error 403: Forbidden
发现了一个问题,我用代理ip的话,可以正常访问,但是没有办法下载了,应该是屏蔽了我下载功能,但是可以正常访问。
正常访问还是很快的!--用免费代理ip即可。

5,弄明白了。 request.urlretrieve 这里,必须加上header请求头,不然服务器一般都会拒绝的。具体加上请求头也很简单。
其次, request.urlretrieve 中,参数我写错了。
request.urlretrieve(url=i["图片链接"],filename='images/'+i["图片名称"]+i["图片格式"])---url和filename必须这么写才行。
其次,images文件夹必须先手动创建好才可以。

6,下载进度到80%的时候。就提示了新错误。
urllib.error.ContentTooShortError: <urlopen error retrieval incomplete: got only 21032 out of 90495 bytes>
不明白啥意思。。百度之后是:urllib.urlretrieve()下载不完全的问题
解决办法:https://blog.csdn.net/Innovation_Z/article/details/51106601

7,try--except被我调试好了之后,就一直循环卡在那里。应该修改一下,跳过。
8,RuntimeError: can't start new thread, 测试的时候线程开得太多了,导致软件开始,不再能够被处理,卡死。
'''

import requests
import re, time
from urllib import request
import os
import socket
import threading
from queue import Queue

items = []
num = 0
gLock = threading.Lock()
q = Queue(100)
def parse_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
        #'Cookie': '__cfduid=dbf4a58fd52d6bbff2edd84c087f103de1556492495; UM_distinctid=16a662eaa6a3b0-0d88093cd8e4bb-5f1d3a17-e1000-16a662eaa6b1bf; _ga=GA1.2.1199216971.1556492496; _gid=GA1.2.610348230.1556492496; yjs_id=c9f5eea2c4cb5dbd197d298576d15289; ctrl_time=1; XSRF-TOKEN=eyJpdiI6ImZGdjRodFNHZ2pSNW9TaHhUY3ptTXc9PSIsInZhbHVlIjoibFRnNnZyaHhoRmhmTU5wZWJtNWEwc0NSRVwvRDdQUnFrdEdBODBKbDlRWFBzbk9seHZkVk44NkFreDNicEJHODgiLCJtYWMiOiI1MmFmNTBkYzRiNDI1NWFlMjc1MzIxNmU3ODMwZjcyYzE2ZjE5NTBhMTk2ZWYzNTJmYjU4NmZjNTM5ZDA3ODJkIn0%3D; doutula_session=eyJpdiI6IlJGVUVFZlhNcmx6UEorTFwvMVVpczRnPT0iLCJ2YWx1ZSI6IjNvbHdXaTFjRGVrZHB1TllreU0zbUIyZGExWXZ0NjM1YlE5eGlRbnBtcUpzNHhhaXdoa2ZmQ1c0S3NOR0tHeUIiLCJtYWMiOiIxMTQ3NDNjZTFlMmJiMTFiMTM5ZjRmNWY0MjY0ZDdiNjQyYzVjMTNjNTY3NmJjNDYyYmJlMmQyYTE5MjIwZWIxIn0%3D; BAIDU_SSP_lcr=https://www.baidu.com/link?url=fdTOuTAcVkFuILyrtze2YFKLVs2tnCDOrM9AR06gWoZwMaJTqabjO-Y1ZiOlH-wo&wd=&eqid=fb0bf5a500066595000000025cc6430b; CNZZDATA1256911977=1763119621-1556491399-null%7C1556496681; _gat=1'
    }
    # proxy = {
    #     'http':'110.52.235.95:9999'
    # }

    response = requests.get(url, headers=headers)
    print(response.status_code)
    text = response.text
    #print(text)
    global items
    global num
    url_links = re.findall(r'data-original="(.*?)" data-backup', text, re.DOTALL)
    #print(url_links)
    titles = re.findall(r'data-original=".*?" data-backup=".*?" alt="(.*?)"', text, re.DOTALL)
    #print(titles)
    for link,title in zip(url_links,titles):
        title = re.sub(r'[!!,??,。.]+','',title)  #标题里一些乱七八糟的符号都过滤掉。用正则sub函数还是很好用的!
        geshi = os.path.splitext(link)[1]  #返回的是每个链接后面的图片格式:例如 .jpeg
        data={
            "图片链接":link,
            "图片名称":title,
            "图片格式": geshi
        }
        # print(data)
        items.append(data)
        num +=1
    print("运行中。。")

    #print(items)


def auto_down():  #想用这个try-except函数,但是系统总是提示urllib没有ContentTooShortError,目前没办法用。

    while 1:
        # 设置超时时间为30s
        opener = request.build_opener()
        opener.addheaders = [('User-Agent',
                              'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36')]
        request.install_opener(opener)
        socket.setdefaulttimeout(2)
        data = q.get()
        try:
            request.urlretrieve(url=data["url"],filename=data["filename"]) #成功了。
        except socket.timeout:
            count = 1
            while count <= 3:
                try:
                    request.urlretrieve(url=data["url"],filename=data["filename"])
                    break
                except socket.timeout:
                    err_info = 'Reloading for %d time' % count if count == 1 else 'Reloading for %d times' % count
                    print(err_info)
                    count += 1
            if count > 3:
                print("downloading picture fialed!")
def get_items():
    url = "http://www.doutula.com/article/list/?page=2"
    for x in range(1, 10):
        url = "http://www.doutula.com/article/list/?page=%s" % x
        parse_page(url)  # 获取了所有页面的图片链接,整理好装进了items列表当中。
    # parse_page(url)
    print("已经下载了第%s个链接" % num)
    print(items)

def set_value(q):
    global items
    for i in items:
        url = i["图片链接"]
        filename = 'images/' + i["图片名称"] + i["图片格式"]
        data = {"url":url,"filename":filename}
        q.put(data)
        # time.sleep(3)

def main():
    get_items()  #获取一个大列表,列表中,都是字典。里面有自己想要的图片信息。
    time_start = time.time()

    t1 = threading.Thread(target=set_value, args=(q,))
    t2 = threading.Thread(target=auto_down)
    t3 = threading.Thread(target=auto_down)
    t1.start()
    t2.start()
    t3.start()


    #计算一下程序耗时。
    time_end = time.time()
    print('totally cost', time_end - time_start)
if __name__ == '__main__':
    main()


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

推荐阅读更多精彩内容

  • 一.资源抢夺 2> 资源抢夺解决方案 @sychronized{ } dispatch_barrier_async...
    蓝心儿的蓝色之旅阅读 1,372评论 0 4
  • iOS中,只有主线程跟Cocoa关联,也即是在这个线程中,更新UI总是有效的,如果在其他线程中更新UI有时候会成功...
    mengyingguo阅读 523评论 0 0
  • 杰杰的大白阅读 114评论 0 0
  • “你在干什么呢?”杨二瞅着杨三在电脑前忙活。 “调论文格式。”杨三头也没抬。 “你们课题?”杨二凑近了,随便瞟上一...
    花间酒一阅读 163评论 0 1
  • 最近一段时间的R语言学习笔记,以便于自己学习之用,特记录在博客中,感兴趣的人还可以看看。记录的东西也不一定正确,请...
    云时之间阅读 530评论 0 4