#更新日志:
#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. Again Stone Game

    Alice and Bob are playing a stone game. Initially there are n piles of stones and each pile contains ...

  2. 三目运算的使用&bytes类型转str类型

    一.三目运算的使用 就像c语言中有三目运算符一样,python中也有三目运算符,废话不多说直接上代码 a=3 c=4 b=a if a>c else c print(b) 意思就和 if a&g ...

  3. jQuery 插件格式 规范

    方式一(自定义对象): (function($, window, document) {  var Plugin, defaults, pluginName; 调用时的函数名:     pluginN ...

  4. vue-cli 前端开发,后台接口跨域代理调试问题

    使用 webpack的方式开发的时候,前台开发过程中需要调用很多后台的数据接口,但是通常前后台分离的开发方式,后台的接口数据很可能是不方便或者是不能在前端同学的电脑上运行的,也就出现了所谓的跨域问题. ...

  5. JavaScript面向对象(收集整理)

    (1)封装 首先理解构造函数:所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. f ...

  6. WebService-axis2

    WebService框架有好多,常用的cxf,axis2等,axis2的配置过程相对简单,不用编写接口,在实现.只需要一个Service服务类即可.配置过程大致如下: 1,导入jar包(这里我是把ax ...

  7. 微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

    在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure.数据.AI 开发工具的内容.这是第一天的 Connect(); 2017 的主题演讲. 在开场视频中霍金又来了.你记 ...

  8. VS2015如何连接mySQL数据库图文

    1.新建一个工程名叫mysql,编程环境选择c#,然后选择windows窗体应用程序,新建一个窗体用于显示查询到sql数据库的数据集 2.从工具箱向form1窗体上拖一个按钮和datagridview ...

  9. 用C#实现DES加密解密解决URL参数明文的问题

    啥也不说,直接上代码. 加密解码,封装到一个类,key可以自己修改. using System; using System.Security.Cryptography; using System.Te ...

  10. RabbitMQ的简单应用

    虽然后台使用了读写分离技术,能够在一定程度上抗击高并发,但是如果并发量特别巨大时,主数据库不能同时处理高并发的请求,这时数据库容易宕机. 问题: 现在的问题是如何既能保证数据库正常运行,又能实现用户数 ...