主要处理的问题有:
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"))
图片下载的内容继续优化了下,见附件
分享到:
相关推荐
scrapy爬取cnblog博客园文章列表保存到本地数据库。这个是本人最近学习爬虫的一个实践案例,源码解析详情请移步博文:https://blog.csdn.net/xiaocy66/article/details/83834261
《C#博客园多线程蜘蛛模式文章采集器》 在信息技术领域,数据采集与处理是至关重要的一环,尤其在互联网大数据时代。本项目“C#博客园多线程蜘蛛模式文章采集器”正是这样一个工具,它利用C#编程语言,结合多线程...
【Xamarin-Android-CNBlog】项目是一个专注于Xamarin平台下的Android开发资源集合,它为中国开发者提供了丰富的中文教程、示例代码和实践经验。Xamarin是一种跨平台的移动开发框架,允许开发者使用C#语言和.NET ...
这是我的cnblog文章备份,可以供大家借阅,观看。 给大家一个福利, 希望大家喜欢! 好用就留个赞吧
Java是一种广泛使用的面向对象的编程语言,被应用于Web开发、移动应用开发、大数据处理等多个领域。通过这个RSS订阅,订阅者可以了解到最新的Java技术趋势、最佳实践、框架更新以及其他与Java编程相关的信息。 ...
博客园(CNBlog)是知名的中文开发者社区,它提供了丰富的技术文章、个人博客、讨论论坛以及各种编程资源。"CNBlog.rar" 是一个压缩文件,其中包含了与博客园相关的数据,可能包括博客文章、用户配置、离线阅读资料...
1. **安装cnblog2anki**:首先,你需要从开发者提供的源或GitHub仓库下载cnblog2anki的最新版本,确保与你的操作系统兼容。 2. **配置cnblog2anki**:运行工具前,需要配置cnblog2anki,包括设置Anki的安装路径,...
通过应用这个主题,博主可以为自己的文章营造出清新、整洁的视觉效果,吸引更多的读者关注。 【描述】"cnblog简单主题"是博主用于保存和管理其博客外观的一种方式。它不仅包含了HTML结构,还涉及到CSS(层叠样式表...
此工具解决的痛点是在本地编辑的 Markdown 文件里包含的图片,在博客园发布时,需要手动一张张的复制到博客园的编辑器中上传,十分麻烦,此文中有详细说明: 二.安装工具 (1)具有 .NET Core/.NET 5 环境可以直接...
在公司里面,经常发现无法在codeproject上下载源码,原因是因为中间少了一段东西,至于是为什么会这样,俺读书少,忽悠不出来。使用方法:点击codeproject上的下载链接时,按住ctrl健,然后迅速去对应的页面拷贝下来...
python爬虫项目班 资料 cnblog_spider.py
cnblog-theme-simpcode 一款简单干净的博客园主题,示例博客: 一、准备 在开始之前,必须要确保你已经申请了博客园 JS 权限,具体申请过程就不详细介绍了,读者自行网上搜索,很简单的。 本皮肤如果经常逛博客的...
验证码(CAPTCHA)作为一种防止自动机器人程序的手段,广泛应用于各大网站,如百度、新浪、BBS、51CTO以及CNblog等,用于保障用户账户安全和防止恶意攻击。C#作为.NET框架下的主要编程语言,具有强大的图形处理和...
Autodesk 3ds Max 2010 是一款由Autodesk公司推出的三维建模、动画和渲染软件,广泛应用于电影、电视、游戏制作以及建筑设计等领域。该版本在2010年发布,提供了许多增强的功能和改进,以帮助用户提高工作效率和创造...
博客园客户端项目源码。我在公司时做的,已经好几年了。来分享分享。 一个IT技术人员想为IT技术人员们提供一个纯净的技术交流空间,博客园很长时间...有了随时了解业内动态的新闻频道,有了知识库,有了期刊,有了……
matlab软件下载:lingo教程数学建模Lingo系列视频(爆肝杰哥): Lingo(1)基础篇:BV1CT4y177qS Lingo(2)入门篇:BV1U
手写实现mybatis,mybatis处理流程图,mybatis实现需要的几个函数,各个函数的调用。
Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML(超文本标记语言)文档。在IT行业中,Markdown因其简洁、直观的语法,常被用于编写博客、文档、README等。...
1.可刷机,所以可买的手机就只剩下小米了 2.至少256GB存储 3.网络不一定要5G,因为目前为止,5G网络覆盖的不好,目前阶段用5G流量跑得快,续航变短 4