#更新日志:
#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. Constructing Roads(最小生成树)

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  2. PHPMailer < 5.2.21 - Local File Disclosure(CVE-2017-5223)

    CVE-2017-5223 :PHPMailer < 5.2.21 - Local File Disclosure 本文主要介绍一下PHPMailer < 5.2.21 - Local F ...

  3. 解决IE下CSS因 Mime 类型不匹配而被忽略的问题

    写页面的时候在chrome,firefox等页面上显示正常,但是换成IE9之后就完全没有样式了,报错信息是CSS 因 Mime 类型不匹配而被忽略,下面与大家分享下这个问题的相关的回答.IE真是个奇葩 ...

  4. c#DES加密解密代码

    //加密  public string DesEncrypt(string strText, string strEncrKey)   {    byte[] byKey=null;    byte[ ...

  5. [转载] 2 分钟读懂大数据框架 Hadoop 和 Spark 的异同

    转载自https://www.oschina.net/news/73939/hadoop-spark-%20difference 谈到大数据,相信大家对Hadoop和Apache Spark这两个名字 ...

  6. python进阶------进程线程(一)

    Python中的进程线程 一.进程线程的概念 1.1进程: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及 ...

  7. canvas图表(3) - 饼图

    原文地址:canvas图表(3) - 饼图 这几天把canvas图表都优化了下,动画效果更加出色了,可以说很逼近echart了.刚刚写完的饼图,非常好的实现了既定的功能,交互的动画效果也是很棒的. 效 ...

  8. Python环境变量搭建

    1.首先下载相对应的Python版本,安装后在系统环境变量的path路径下加入安装的默认路径: 2.测试:dos命令下输入python.回车,然后测试,exit()退出来,测试完成.

  9. Python 爬虫练习(三) 利用百度进行子域名收集

    不多介绍了,千篇一律的正则匹配..... import requests import re head = {'User-Agent': \ 'Mozilla/5.0 (Windows NT 6.3; ...

  10. 关于SpringBoot bean无法注入的问题(与文件包位置有关)改变自动扫描的包

    原因:同事在写demo时出现bean加了@component后却无法被spring扫描到(在编译的时候IDEA就提示拿不到对应的bean)的问题. 后来经过研究是跟文件包的位置有关的. springb ...