`
mushme
  • 浏览: 788484 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

多线程下载cnblog新闻图片

 
阅读更多
主要处理的问题有:
1.如何防止重复下载
2.网络访问一般较慢,需要多线程协助提升下载速度
解决方案:
1.先遍历列表页,将图片地址保存到数据库中,保存时,判断是否有重复。
2.使用多线程,下载数据库中的图片
一.下载图片地址

# -*- coding:utf-8 -*-

from bs4 import BeautifulSoup
import urllib.request
from urllib import request
# 导入SQLite驱动:
import sqlite3

DB_FILE_NAME="images.sqlite"

def saveLinks(link,title=None):
    if title is None:
	    title=""
    conn = sqlite3.connect(DB_FILE_NAME)
    cursor = conn.cursor()
    # 执行一条SQL语句,创建user表:
    cursor.execute('create table IF NOT EXISTS images (id INTEGER PRIMARY KEY, title varchar(100),link vachar(100),content text,status Integer default(0))')
    cursor.execute('select * from images where link=\''+link+'\'')
    values=cursor.fetchall()
    if len(values) > 0:#链接以前就存在
        print('链接已经存在:'+link)
    else:
        cursor.execute('insert into images (title, link,status) values (\''+title+'\', \''+link+'\',0)')
        print("save success."+link)    
# 关闭Cursor:
    cursor.close()
# 提交事务:
    conn.commit()
# 关闭Connection:
    conn.close()
    
def getListPage(id):	
    #1.获取页面内容html
    listlink='http://news.cnblogs.com/n/page/'+id+'/'
    print('-'*20+listlink)
    with request.urlopen(listlink) as f:
        html_doc=f.read()
    '''2.分析页面内容,获取标题内容和链接[格式如下]
    <div class="entry_summary" style="display: block;">
                            <a href="/n/topic_389.htm"><img src="http://images0.cnblogs.com/news_topic/阿里云.gif" class="topic_img" alt=""/></a>
    '''
    soup = BeautifulSoup(html_doc,"html.parser")
    news_array=soup.find_all('img', {'class': 'topic_img'})
    for news in news_array:
        saveLinks(news.get("src"))
        
############正式代码开始
startId=6
size=5        
for m in range(startId,startId+size):
        getListPage(str(m))     
    
    


二、下载实际图片
# -*- coding:utf-8 -*-
import threading
import urllib.request
import sqlite3
from urllib.request import quote

SAVE_PATH="F:\\python\\download\\"
DB_FILE_NAME="images.sqlite"

hosturl='http://www.weibo.com/'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',  
           'Referer' : hosturl} 
 

#根据url下载图片,如果没有设置图片地址,自动保存到D:\\download\\图片名称
def downImg(imgUrl,savePath=None):
 
    imgName=imgUrl.split('/')[-1]
    preUrl=imgUrl.replace(imgName,'')
    request = urllib.request.Request(preUrl+quote(imgName), None, headers)  
    response = urllib.request.urlopen(request)
	
    if savePath is None:
	    savePath=SAVE_PATH+imgName
    f = open(savePath,'wb')
    f.write(response.read())
    f.close()
    print('Saved:'+savePath) 

#保存文件时候注意类型要匹配,如要保存的图片为jpg,则打开的文件的名称必须是jpg格式,否则会产生无效图片

def saveImage(id):
    conn = sqlite3.connect(DB_FILE_NAME)
    cursor = conn.cursor()
    #print(id)
    cursor.execute('select * from images where status=0 and id=?',(id,))
    values = cursor.fetchall()
    
    for line in values:
        #id=line[0]
        link=line[2]
        try:
            downImg(link)
            cursor.execute('update images set status=1 where id=?',(id,))
        except Exception  as e:
            print('except:',e)
    cursor.close()
    conn.commit()
    conn.close()   

def saveImagess(startId,size):
    for m in range(startId,startId+size):
        saveImage(str(m))   
    
threads = []
startPos=1

#######十个线程,每个线程抓取500个数据
threadCount=4#开启的线程数
p_size=10

i=0
for x in range(1,threadCount+1):
    t1 = threading.Thread(target=saveImagess,args=((startPos+i*p_size),p_size))
    threads.append(t1)
    i=i+1

for t in threads:
    t.start()
t.join()



顺便贴点妹子图,请自行参照第一步处理
def getListPage(id):	
    #1.获取页面内容html
    listlink='http://jandan.net/ooxx'
    print('-'*20+listlink)
    with request.urlopen(listlink) as f:
        html_doc=f.read()
    soup = BeautifulSoup(html_doc,"html.parser")
    news_array=soup.find_all('a', {'class': 'view_img_link'})
    for news in news_array:
        print(news.get("href"))
        #saveLinks(news.get("href"))


图片下载的内容继续优化了下,见附件
0
4
分享到:
评论

相关推荐

    scrapy爬取cnblog博客园

    scrapy爬取cnblog博客园文章列表保存到本地数据库。这个是本人最近学习爬虫的一个实践案例,源码解析详情请移步博文:https://blog.csdn.net/xiaocy66/article/details/83834261

    C#博客园多线程蜘蛛模式文章采集器

    《C#博客园多线程蜘蛛模式文章采集器》 在信息技术领域,数据采集与处理是至关重要的一环,尤其在互联网大数据时代。本项目“C#博客园多线程蜘蛛模式文章采集器”正是这样一个工具,它利用C#编程语言,结合多线程...

    Xamarin-Android-CNBlog

    【Xamarin-Android-CNBlog】项目是一个专注于Xamarin平台下的Android开发资源集合,它为中国开发者提供了丰富的中文教程、示例代码和实践经验。Xamarin是一种跨平台的移动开发框架,允许开发者使用C#语言和.NET ...

    我的cnblog文章备份

    这是我的cnblog文章备份,可以供大家借阅,观看。 给大家一个福利, 希望大家喜欢! 好用就留个赞吧

    CnBlog:cnblog.com的RSS

    Java是一种广泛使用的面向对象的编程语言,被应用于Web开发、移动应用开发、大数据处理等多个领域。通过这个RSS订阅,订阅者可以了解到最新的Java技术趋势、最佳实践、框架更新以及其他与Java编程相关的信息。 ...

    CNBlog.rar_CNBLOG@DLHC-TECH_cbnlog_cnblog_http://www.cnblo_juwan

    博客园(CNBlog)是知名的中文开发者社区,它提供了丰富的技术文章、个人博客、讨论论坛以及各种编程资源。"CNBlog.rar" 是一个压缩文件,其中包含了与博客园相关的数据,可能包括博客文章、用户配置、离线阅读资料...

    cnblog2anki weibo2anki 超链接提取然后导入anki

    1. **安装cnblog2anki**:首先,你需要从开发者提供的源或GitHub仓库下载cnblog2anki的最新版本,确保与你的操作系统兼容。 2. **配置cnblog2anki**:运行工具前,需要配置cnblog2anki,包括设置Anki的安装路径,...

    cnblog简单主题

    通过应用这个主题,博主可以为自己的文章营造出清新、整洁的视觉效果,吸引更多的读者关注。 【描述】"cnblog简单主题"是博主用于保存和管理其博客外观的一种方式。它不仅包含了HTML结构,还涉及到CSS(层叠样式表...

    dotnet-cnblogs-tool:博客园文章快捷发布工具

    此工具解决的痛点是在本地编辑的 Markdown 文件里包含的图片,在博客园发布时,需要手动一张张的复制到博客园的编辑器中上传,十分麻烦,此文中有详细说明: 二.安装工具 (1)具有 .NET Core/.NET 5 环境可以直接...

    下载codeproject上的源码

    在公司里面,经常发现无法在codeproject上下载源码,原因是因为中间少了一段东西,至于是为什么会这样,俺读书少,忽悠不出来。使用方法:点击codeproject上的下载链接时,按住ctrl健,然后迅速去对应的页面拷贝下来...

    python爬虫项目班 资料 cnblog_spider.py

    python爬虫项目班 资料 cnblog_spider.py

    cnblog-theme-simpcode:一款简单干净的博客园主题

    cnblog-theme-simpcode 一款简单干净的博客园主题,示例博客: 一、准备 在开始之前,必须要确保你已经申请了博客园 JS 权限,具体申请过程就不详细介绍了,读者自行网上搜索,很简单的。 本皮肤如果经常逛博客的...

    C# 验证马识别 可识别百度 新浪 BBS 51CTO CNblog等大型网站

    验证码(CAPTCHA)作为一种防止自动机器人程序的手段,广泛应用于各大网站,如百度、新浪、BBS、51CTO以及CNblog等,用于保障用户账户安全和防止恶意攻击。C#作为.NET框架下的主要编程语言,具有强大的图形处理和...

    Autodesk 3ds Max 2010 注册机 算号器 32bits 64bits

    Autodesk 3ds Max 2010 是一款由Autodesk公司推出的三维建模、动画和渲染软件,广泛应用于电影、电视、游戏制作以及建筑设计等领域。该版本在2010年发布,提供了许多增强的功能和改进,以帮助用户提高工作效率和创造...

    CNBlog.rar_it_个人团队源码_工作站_网络

    博客园客户端项目源码。我在公司时做的,已经好几年了。来分享分享。 一个IT技术人员想为IT技术人员们提供一个纯净的技术交流空间,博客园很长时间...有了随时了解业内动态的新闻频道,有了知识库,有了期刊,有了……

    JiangLongLiu#cnblog-757617012#数学软件与教程收集.142

    matlab软件下载:lingo教程数学建模Lingo系列视频(爆肝杰哥): Lingo(1)基础篇:BV1CT4y177qS Lingo(2)入门篇:BV1U

    手写mybatis单表查询实现-cnblog.md

    手写实现mybatis,mybatis处理流程图,mybatis实现需要的几个函数,各个函数的调用。

    myblog:将markdown博客文件直接发布到cnblog并管理使用情况的博客文件

    Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML(超文本标记语言)文档。在IT行业中,Markdown因其简洁、直观的语法,常被用于编写博客、文档、README等。...

    JiangLongLiu#cnblog-757617012#2020.12 考虑买的手机.71

    1.可刷机,所以可买的手机就只剩下小米了 2.至少256GB存储 3.网络不一定要5G,因为目前为止,5G网络覆盖的不好,目前阶段用5G流量跑得快,续航变短 4

Global site tag (gtag.js) - Google Analytics