#更新日志:
#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. Problem X

    Problem Description Recently, iSea went to an ancient country. For such a long time, it was the most ...

  2. 补写:Best Coder #85 1001 Sum(前缀和)

    sum Accepts: 640 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  3. CUDA C Best Practices Guide 在线教程学习笔记 Part 2

    10. 执行配置优化 ● 一个 SM中,占用率 = 活动线程束的数量 / 最大可能活动线程束的数量.后者保存在设备属性的  maxThreadsPerMultiProcessor  分量中(GTX10 ...

  4. springmvc+quartz简单实现定时调度

    一.简介:Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十 ...

  5. 2.安装Nginx

    安装稳定版本的nginx 1.为CentOS系统安装yum仓库,创建文件 /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=htt ...

  6. Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之ssh框架整合

    前言        转载请标明出处:http://www.cnblogs.com/smfx1314/p/7795837.html 本项目是我写的一个练习,目的是回顾ssh框架的整合以及使用.项目介绍: ...

  7. unity下跨平台excel读写

    这是以前写的跨windows和ios读写excel的工具,因为原来导表工具引用的第三方读写excel的dll只能在windos下使用,造成要在mac机器上跑PC端或者打包的时候,每次都要先在windo ...

  8. 浅谈如何使用swfupload工具与struts2无缝相接

    笔者在网上查找流行的上传组件,swfupload引入眼帘,受到JavaEye的一篇文章启发,历时三天,加以研究,现将心得奉上,献礼JavaEye. 由于笔者才疏学浅,经验匮乏,介绍不深入,仅供菜鸟参考 ...

  9. 使用.net连接domino的尝试

    导入包含Domino命名空间的dll:                  } 这里需要提到的是dynamic cast 运行期绑定的代码,需要做类型转化.

  10. DateTime格式

    SELECT * FROM TABLE (TO_DATE('2007/9/1','yyyy/mm/dd') BETWEEN CGGC_STRATDATE AND CGGC_ENDDATE OR CGG ...