# 最近在实验楼学习了爬取妹子图,发现在运行的时候不是很流畅,有些图片下 1 # coding: utf-8

 # coding: utf-8

 import re
import threading
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import meizi_series_nextpage def loadurl(url):
try:
conn = urlopen(url)
html = conn.read()
return html
except HTTPError as e:
return e
except Exception as e:
print("unkown exception in conn.read() %s "%e)
return '' def meizi(url,path):
# 获取首页标签
print('start open meiziwang')
html = ''
while True:
html = loadurl(url)
if html == '':
print('load', url,'error')
continue
else:
break
mnvtp = BeautifulSoup(html)
taglists = mnvtp.findAll("div",{"class":"tags"})
taglistss = re.findall('<a.*?href="(.*?)".*?>','%s'%taglists)
print(list(set(taglistss)))
print(len(list(set(taglistss))))
print('open meiziwang over')
meizi_series_nextpage.nextpage(url,path)
threads = []
for url in list(set(taglistss)):
t =threading.Thread(target=meizi_series_nextpage.nextpage, args=(url, path))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
if __name__ == '__main__':
meizi('http://www.meizitu.com','D:\\MeiZi\\')
print ('Spider Stop')
# coding: utf-8
import re
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import meizi_series_getpage #同样的,这里是加载链接防超时
def loadurl(url):
try:
conn = urlopen(url, timeout=5)
html = conn.read()
return html
except HTTPError as e:
print(e)
except Exception as e:
print(e) def nextpage(url,path):
#获取首页尾部标签
nextweibu = re.split("/",url)
# 获取头部文件
nexthead = re.split("/a/",url)
nexthead = nexthead[0] + "/a/"
# 创建首页路径
path = path+"\\"+nextweibu[-1].split(".",1)[0]
# 获取html
while True:
html = loadurl(url)
if html == '':
print('load', url,'error')
continue
else:
break
# 获取子标签
mnvtp = BeautifulSoup(html)
taglists = mnvtp.findAll("div",{"id":"wp_page_numbers"})
taglists = re.findall('<a.*?href="(.*?)".*?>','%s'%taglists)
taglists = sorted(list(set(taglists)))
if taglists == []:
taglists = [nextweibu[-1]] # 获取单个首页所有标签完整url路径
print("正在获取首页所有子标签Url:%s"%url)
completeurl = []
for i in taglists:
url = nexthead + i
completeurl.append(url)
completeurl = sorted(completeurl)
for i in completeurl:
print("正在获取子标签下所有套图url路径")
meizi_series_getpage.tag_series(i,path)
# coding: utf-8
import time
from urllib.request import urlopen
from urllib.request import Request
from urllib.error import HTTPError
from urllib.request import urlretrieve
import os
import re
from bs4 import BeautifulSoup
import urllib
from urllib import parse
# 图片下载的主逻辑函数,获取图片链接,然后传给pic_list()
def picurl(url,path):
if os.path.exists(path):
print(path,'目录已存在')
else:
print("正在创建目录:%s"%path)
os.makedirs(path)
# 获取套图url(图片)地址
html = ''
while True:
html = loadurl(url)
if html == '':
continue
else:
break
rePicContent1 = '<div.*?id="picture.*?>.*?<p>(.*?)</p>'
rePicContent2 = '<div.*?class="postContent.*?>.*?<p>(.*?)</p>'
rePicList = '<img.*?src="(.*?)".*?>'
#这里对re.S做个介绍,re.S是可以不添加的,加上之后,它的作用就是能忽略换行符,将两条作为一条来匹配。html代码碰上换行的概率是很高的,所以我一致采用re.S(下文有配图)
picContent = re.findall(rePicContent1,"%s"%html,re.S)
if len(picContent) <=0:
picContent = re.findall(rePicContent2, "%s"%html,re.S)
if len(picContent) <=0:
print('无法匹配到对应的图片url')
return False
else:
picList = re.findall(rePicList,"%s"%picContent[0],re.S)
pic_list(picList,path) # #这个函数,相当于一个中介,我只是把for循环代码提出就得到了这个函数
def pic_list(picList,path):
for picurl in picList:
print("获取图片地址:%s"%picurl)
save_pic(picurl,path) #保存图片的逻辑代码块
def save_pic(url,path):
searchname = '.*/(.*?.jpg)'
name = re.findall(searchname,url)
filename = path +'\\'+ name[0] print(filename + ':start') #控制台显示信息 #定义了在下载图片时遇到错误的重试次数
tryTimes = 3 #当重试次数没有用完时,则尝试下载
while tryTimes != 0:
tryTimes -= 1
if os.path.exists(filename):
print(filename,'已存在,跳过')
return True
elif os.path.exists(filename):
os.mknod(filename)
if download(url,filename):
break if tryTimes != 0:
print(filename + ": over")
else:
print(url + " :Failed to download")
#控制台显示信息 #这里是图片保存的代码被调函数,timeout=5设置超时时间,一个500k不到的图片,5秒时间算长的了,超时的话,返回失败 def download(url,filename): try:
headers = {
'Host':'mm.howkuai.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
}
Url = Request(url,headers=headers)
req = urlopen(Url).read()
f = open(filename,'wb')
f.write(req)
f.close()
return True
except HTTPError as e:
print(e)
return False
except Exception as e:
print(e) def loadurl(url): try:
conn = urlopen(url,timeout=5)
html = conn.read()
return html
except HTTPError as e:
return ''
except Exception as e:
print("unkown exception in conn.read()")
return ''

有时间在来解释代码含义,第一段代码是主函数,分别根据导入的py创建既可。

Python3网络爬虫的更多相关文章

  1. Python3 网络爬虫(请求库的安装)

    Python3 网络爬虫(请求库的安装) 爬虫可以简单分为几步:抓取页面,分析页面和存储数据 在页面爬取的过程中我们需要模拟浏览器向服务器发送请求,所以需要用到一些python库来实现HTTP的请求操 ...

  2. 崔庆才Python3网络爬虫开发实战电子版书籍分享

    资料下载地址: 链接:https://pan.baidu.com/s/1WV-_XHZvYIedsC1GJ1hOtw 提取码:4o94 <崔庆才Python3网络爬虫开发实战>高清中文版P ...

  3. 《Python3 网络爬虫开发实战》开发环境配置过程中踩过的坑

    <Python3 网络爬虫开发实战>学习资料:https://www.cnblogs.com/waiwai14/p/11698175.html 如何从墙内下载Android Studio: ...

  4. 《Python3 网络爬虫开发实战》学习资料

    <Python3 网络爬虫开发实战> 学习资料 百度网盘:https://pan.baidu.com/s/1PisddjC9e60TXlCFMgVjrQ

  5. Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...

  6. 转:【Python3网络爬虫开发实战】 requests基本用法

    1. 准备工作 在开始之前,请确保已经正确安装好了requests库.如果没有安装,可以参考1.2.1节安装. 2. 实例引入 urllib库中的urlopen()方法实际上是以GET方式请求网页,而 ...

  7. Python3网络爬虫(四):使用User Agent和代理IP隐藏身份《转》

    https://blog.csdn.net/c406495762/article/details/60137956 运行平台:Windows Python版本:Python3.x IDE:Sublim ...

  8. Python3网络爬虫(1):利用urllib进行简单的网页抓取

    1.开发环境 pycharm2017.3.3 python3.5 2.网络爬虫的定义 网络爬虫,也叫网络蜘蛛(web spider),如果把互联网比喻成一个蜘蛛网,spider就是一只在网上爬来爬去的 ...

  9. python3网络爬虫系统学习:第一讲 基本库urllib

    在python3中爬虫常用基本库为urllib以及requests 本文主要描述urllib的相关内容 urllib包含四个模块:requests——模拟发送请求 error——异常处理模块 pars ...

  10. 《Python3网络爬虫开发实战》

    推荐:★ ★ ★ ★ ★ 第1章 开发环境配置 第2章 网页基础知识 第3章 网络爬虫基础 第4章 基本库的使用 第5章 解析库的使用 第6章 数据存储 第7章 Ajax数据爬取 第8章 动态渲染页面 ...

随机推荐

  1. angular directive

    1.restrict (字符串)可选参数,指明指令在DOM里面以什么形式被声明: 取值有:E(元素),A(属性),C(类),M(注释),其中默认值为A: E(元素):<directiveName ...

  2. Linux学习(一)

    Linux系统 1.组成部分 1.1内核负责的功能 1.1.1:系统内存管理 内存管理即管理物理内存和虚拟内存 (通过硬盘实现的,即swap space),长时间为被访问的内存块会被放到虚拟内存中,当 ...

  3. Javascript的内容

    JS简介和变量 {JS的三种方式}            1 HTML中内嵌JS(不提倡使用)            <button onclick="javascript:alert ...

  4. Android sdk配置 常见问题及处理方法

    1. 下载sdk压缩包,解压后显示 2.双击SDK Manager.exe 程序进入如下界面 注:有的童鞋可能遇到如下问题 一般将一和二两种操作都完成就OK了 一. 更新sdk,遇到了更新下载失败问题 ...

  5. 【Spark2.0源码学习】-4.Master启动

         Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作   一.脚本概览      下面是一个举例: /opt/jdk1..0_79/ ...

  6. 内存管理之slab分配器

    基本思想 与传统的内存管理模式相比, slab 缓存分配器提供了很多优点.首先,内核通常依赖于对小对象的分配,它们会在系统生命周期内进行无数次分配.slab 缓存分配器通过对类似大小的对象进行缓存而提 ...

  7. Linux环境下用户空间与内核空间数据的交换方式

    在linux环境开发过程中,经常会需要在用户空间和内核空间之间进行数据交换. 介绍了 Linux 系统下用户空间与内核空间数据交换的几种方式 第一节:使用procfs实现内核交互简明教程(1) 第二节 ...

  8. flex布局下,css设置文本不换行时,省略号不显示的解决办法

    大致是有一个main容器是flex布局,左边一个logo固定宽高,右边content动态宽度. <div class="main"> <img alt=" ...

  9. Supervisor: A Process Control System

    Supervisor: 进程控制系统 概述:Supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序. 它与launch ...

  10. 关于jstl.jar引用问题及解决方法

    在前文SSM说到因为从MyEclipse换成了Eclipse.有些架包自动缺失. 造成:"org.apache.jasper.JasperException: This absolute u ...