#更新日志:
#0418 爬取页面商品URL
#0421 更新 添加爬取下载页面图片功能
#0423 更新 添加发送邮件功能
# 优化 爬虫异常处理、错误页面及空页面处理
# 优化 爬虫关键字黑名单、白名单,提高效率

################################################################# 
#author: 陈月白
#_blogs: http://www.cnblogs.com/chenyuebai/
#################################################################  1 # -*- coding: utf-8 -*-
import urllib.request
import sys
import traceback
import re
import socket
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr socket.setdefaulttimeout(15.0) class CRAWLER():
#初始化变量
def __init__(self):
self.pageIndex = 0
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
self.headers = {'User-Agent':self.user_agent} #传入网页链接,抓取页面html数据
def get_page(self,url,black_keyword_list=[],must_keyword_list=[]):
try:
page_data = ""
request = urllib.request.Request(url,headers=self.headers)
response = urllib.request.urlopen(request,timeout=10)
page_data = response.read().decode()
#print("####################\n",page_data)
except:
print("get_page %s catch a error,now return"%url)
#traceback.print_exc()
return page_data #设置黑名单关键字过滤无效网页,即page_data中若存在该关键字则视为page_data为空
if black_keyword_list:
for black_keyword in black_keyword_list:
if black_keyword in page_data:
print("black_keyword =",black_keyword)
page_data = ""
return page_data #设置page_data必须包含的关键字,若不含则视为page_data为空
if must_keyword_list:
for must_keyword in must_keyword_list:
if not must_keyword in page_data:
print("must_keyword: [%s] is not in page_data,now let page_data is empty!"%must_keyword)
page_data = ""
return page_data if page_data == '':
print("EXEC:get_page(%s) failed,page_data is empty..."%url)
return page_data
else:
print("EXEC:get_page(%s)success!"%url)
return page_data #入口,传入url,初步筛选信息
def select_items_from_url(self,url,flag,black_keyword_list=[],must_keyword_list=[]):
print("url =",url)
print("flag =",flag)
page_data = self.get_page(url,black_keyword_list,must_keyword_list)
#print("page_data =",page_data)
if page_data == "":
print("page_data =",page_data)
return page_data
#print("-----",page_data) pattern = re.compile(flag,re.S)
print("pattern =",pattern)
items = re.findall(pattern,page_data)
#print("FUNC:select_items_from_url items =",items)
if items == "":
print("EXEC:select_items_from_url failed,select items is empty")
return items
else:
print("EXEC:select_items_from_url success!")
# print("items =",items)
return items def load_image_by_imageUrl(self,image_url,image_load_fullpath):
print("image_url =",image_url)
print("image_load_fullpath =",image_load_fullpath)
# try:
# urllib.request.urlretrieve(image_url,image_load_fullpath)
# except:
# print("CATCH AN ERROR FUNC:load_image_by_imageUrl %s failed..."%image_url)
# return
try:
opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36')]
urllib.request.install_opener(opener) print("now start to load %s"%image_url)
urllib.request.urlretrieve(image_url,image_load_fullpath)
print("FUNC:load_image_by_imageUrl %s success!"%image_url)
except:
print("CATCH AN ERROR FUNC:load_image_by_imageUrl %s failed..."%image_url)
return def start(self):
pass def send_email(self,receive_user,topic_name,body_text):
send_user = "85********2@qq.com"
send_passwd = "********" try:
msg = MIMEText(body_text,'plain','utf-8') #邮件内容
msg['From'] = formataddr(["********",send_user]) #收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = topic_name #邮件主题s server = smtplib.SMTP("smtp.qq.com",25)
server.set_debuglevel(1)
server.connect("smtp.qq.com")
server.ehlo()
server.starttls()
server.ehlo()
server.login(send_user,send_passwd) #登录
server.sendmail(send_user,receive_user,msg.as_string())
server.quit()
print("send mail to %s success!"%receive_user)
except:
print("send mail to %s failed!"%receive_user)


#main
def get_goods_image_from_suning():
suning = CRAWLER()
flag = '<img class="search-loading" width="220" height="220" src2="(.*?)"></a>'
page_num = 5
name_index = 0
try:
for i in range(page_num):
items = suning.select_items_from_url('https://list.suning.com/0-20006-%s.html'%i,flag)
#print(items)
if items == "":
continue
else:
for item in items:
#print(item)
load_image_fullpath = r"E:\\workSpace\\TMP\\%s.jpg"%name_index
suning.load_image_by_imageUrl("http:%s"%item,load_image_fullpath)
name_index = name_index + 1
print("FUNC:get_goods_image_from_suning success! image load path is :%s"%load_image_fullpath)
except:
print("CATCH AN ERROR FUNC:get_goods_image_from_suning")
pass #main
def get_adu_image_from_9():
socket.setdefaulttimeout(5.0)
adu = CRAWLER() flag = '<img src=".*?" file="(.*?)".*?onmouseover=.*?alt=.*?/>'
page_index = 171186 #160202 #150007
black_keyword_list = ["您无权进行当前操作,原因如下","对不起,找不到页面!<br>"]
must_keyword_list = ["attachments"] image_download_num = 0
while True:
try:
print("------------------------------------------------------------------------")
items = adu.select_items_from_url('http://********tid=%s'%page_index,flag,black_keyword_list,must_keyword_list)
page_index = page_index + 1
#print(items)
if items == "":
print("")
continue
else:
for item in items:
#print("tettt_item =",item)
image_name = item.split("/")[1]
print("image_name =",image_name)
load_image_fullpath = r"E:\\workSpace\\TMP\\ad_image\\%s_%s"%(page_index-1,image_name)
adu.load_image_by_imageUrl("http://********/%s"%item,load_image_fullpath)
image_download_num = image_download_num + 1
print("FUNC:get_adu_image_from_9 success! image load path is :%s"%load_image_fullpath)
print("image_download_num now is %s \n"%image_download_num)
except:
print("CATCH AN ERROR FUNC:get_adu_image_from_9\n") def love_letter():
love_ch = CRAWLER()
love_ch.send_email(["50********9@qq.com","46********@qq.com"],"LOVE MAIL 05","我爱你!") ############################################################################
def main():
#get_adu_image_from_9()
love_letter() main()

#执行结果

1.爬取图片(大概运行1小时,效率还凑合):

2.发送邮件:

python3.6 urllib.request库实现简单的网络爬虫、下载图片的更多相关文章

  1. 采用requests库构建简单的网络爬虫

    Date: 2019-06-09 Author: Sun 我们分析格言网 https://www.geyanw.com/, 通过requests网络库和bs4解析库进行爬取此网站内容. ​ 项目操作步 ...

  2. Python3 urllib.request库的基本使用

    Python3 urllib.request库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urlli ...

  3. 爬虫——urllib.request库的基本使用

    所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很多库可以用来抓取网页,我们先学习urllib.request.(在python2.x中为urllib2 ...

  4. Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)

    Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起 ...

  5. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

  6. 在python3中使用urllib.request编写简单的网络爬虫

    转自:http://www.cnblogs.com/ArsenalfanInECNU/p/4780883.html Python官方提供了用于编写网络爬虫的包 urllib.request, 我们主要 ...

  7. 爬虫入门【1】urllib.request库用法简介

    urlopen方法 打开指定的URL urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, ca ...

  8. 通过python的urllib.request库来爬取一只猫

    我们实验的网站很简单,就是一个关于猫的图片的网站:http://placekitten.com 代码如下: import urllib.request respond = urllib.request ...

  9. python3 spider [ urllib.request ]

    # # 导入urllib库的urlopen函数 # from urllib.request import urlopen # # 发出请求,获取html # html = urlopen(" ...

随机推荐

  1. code forces 436 C. Bus

    C. Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  2. 0_Simple__inlinePTX + 0_Simple__inlinePTX_nvrtc

    在核函数代码中加入并行线程执行(Parallel Thread eXecution,PTX),通过汇编指令获取得有关线程束的信息.并且在静态代码和运行时编译两种条件下使用. ▶ 源代码:静态使用 #i ...

  3. display:none,float小秘密

    一个元素不管是块元素还是行内元素   在添加了 display:none 之后,就变成了不可见的块元素,可以给他添加长度和高度   在float之后内联元素也会隐性成为  inline-block   ...

  4. 小米/红米导入VCF联系人乱码问题解决

    PS:尽量不要用什么豌豆荚啊.微信啊.QQ啊之类的通讯录备份,那就等于把自己的通讯录免费送给腾讯他们了....还是自己手动的好一些,但是小白用户或者经常丢手机的卖就卖吧,总比联系人都丢了要好~~~ 默 ...

  5. JAVA 的关键字 、

    关键字: 被JAVA语言赋予特定含义的单词, 特点: 组成关键字的单词的字母全部小写 注意: A:goto 和 const 是保留字 B: 类似于Notepad++ 这样的高级记事本,针对关键字有特殊 ...

  6. Maven仓库-Nexus环境搭建及简单介绍

    1.    环境搭建 1.1  下载 http://www.sonatype.org/nexus/ NEXUS OSS [OSS = Open Source Software,开源软件——免费] NE ...

  7. [原创]阿里云RocketMQ踩过的哪些坑

    由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...

  8. WPF 完美截图 <二>

    根据WPF 完美截图 <一>总结: 1.BitmapSource与BitmapImage及CorppedBitmap之间的转换 2.中心及边角的模板实现及其拖动 3.除了拖动矩形外区域要实 ...

  9. 初识Redux-Saga

    Redus-saga是一个redux的中间件,主要用来简便而优雅的处理redux应用里的副作用(side effect相对于pure function这类概念而言的).它之所以可以做到这一点主要是使用 ...

  10. 通过 Visual Studio 的“代码度量值”来改进代码质量

    1 软件度量值指标 1.1 可维护性指数 表示源代码的可维护性,数值越高可维护性越好.该值介于0到100之间.绿色评级在20到100之间,表明该代码具有高度的可维护性:黄色评级在10到19之间,表示该 ...