Python3网络爬虫
# 最近在实验楼学习了爬取妹子图,发现在运行的时候不是很流畅,有些图片下 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网络爬虫的更多相关文章
- Python3 网络爬虫(请求库的安装)
Python3 网络爬虫(请求库的安装) 爬虫可以简单分为几步:抓取页面,分析页面和存储数据 在页面爬取的过程中我们需要模拟浏览器向服务器发送请求,所以需要用到一些python库来实现HTTP的请求操 ...
- 崔庆才Python3网络爬虫开发实战电子版书籍分享
资料下载地址: 链接:https://pan.baidu.com/s/1WV-_XHZvYIedsC1GJ1hOtw 提取码:4o94 <崔庆才Python3网络爬虫开发实战>高清中文版P ...
- 《Python3 网络爬虫开发实战》开发环境配置过程中踩过的坑
<Python3 网络爬虫开发实战>学习资料:https://www.cnblogs.com/waiwai14/p/11698175.html 如何从墙内下载Android Studio: ...
- 《Python3 网络爬虫开发实战》学习资料
<Python3 网络爬虫开发实战> 学习资料 百度网盘:https://pan.baidu.com/s/1PisddjC9e60TXlCFMgVjrQ
- Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘
百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...
- 转:【Python3网络爬虫开发实战】 requests基本用法
1. 准备工作 在开始之前,请确保已经正确安装好了requests库.如果没有安装,可以参考1.2.1节安装. 2. 实例引入 urllib库中的urlopen()方法实际上是以GET方式请求网页,而 ...
- Python3网络爬虫(四):使用User Agent和代理IP隐藏身份《转》
https://blog.csdn.net/c406495762/article/details/60137956 运行平台:Windows Python版本:Python3.x IDE:Sublim ...
- Python3网络爬虫(1):利用urllib进行简单的网页抓取
1.开发环境 pycharm2017.3.3 python3.5 2.网络爬虫的定义 网络爬虫,也叫网络蜘蛛(web spider),如果把互联网比喻成一个蜘蛛网,spider就是一只在网上爬来爬去的 ...
- python3网络爬虫系统学习:第一讲 基本库urllib
在python3中爬虫常用基本库为urllib以及requests 本文主要描述urllib的相关内容 urllib包含四个模块:requests——模拟发送请求 error——异常处理模块 pars ...
- 《Python3网络爬虫开发实战》
推荐:★ ★ ★ ★ ★ 第1章 开发环境配置 第2章 网页基础知识 第3章 网络爬虫基础 第4章 基本库的使用 第5章 解析库的使用 第6章 数据存储 第7章 Ajax数据爬取 第8章 动态渲染页面 ...
随机推荐
- gulp基于seaJs模块化项目打包实践【原创】
公司还一直在延续使用jq+seajs的技术栈,所以只能基于现在的技术栈进行静态文件打包,而众所周知seajs的打包比较"偏门",在查了不少的文档和技术分享后终于琢磨出了自己的打包策 ...
- 告别findViewById(),ButterKnife,使用Google Data Binding Library(1)
Data Binding Library 用数据绑定编写声名性布局,可以最大限度的减少findViewById(),setOnClickListener()之类的代码.并且比起findViewById ...
- JsonResult,Controller.Json
表示一个类,该类用于将 JSON 格式的内容发送到响应. ContentEncoding:编码格式(最好按标准utf-8) ContentType: mime类型 Data:数据设置 JsonRequ ...
- (二)一起学 Java Collections Framework 源码之 AbstractCollection
. . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...
- 基于Maven的SSM整合的web工程
此文章主要有以下几个知识点: 一.如何创建 Maven的Web 工程 二.整合SSM(Spring,SpringMvc,Mybatis),包括所有的配置文件 三.用 mybatis 逆向工程生成对应的 ...
- vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。
最近新装了2017,开始前几天还好, 可是最近在添加引用时,报错 ---------------------------Microsoft Visual Studio----------------- ...
- Angularjs快速入门(一)
这系列是看<用angularjs开发下一代web应用>的笔记. angular也接触几个月,总觉得不甚明白,写起来总是不那么如意.希望这本书看完了可以改变现在的状况.好了废话不多说开始: ...
- [内存管理]连续内存分配器(CMA)概述
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 原文地址:http://lwn.net/Articles/396657/ 1 ...
- PLSQL 配置设置
1.登录后默认自动选中MyObjects 默认情况下,PLSQLDeveloper登录后,Brower里会选择Allobjects,如果你登录的用户是dba,要展开tables目录,正常情况都需要Wa ...
- TreeSet对非自然顺序元素的排序
/* 1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储. 2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该 ...