前言

hello,大家好

本章可是一个重中之重,因为我们今天是要爬取一个图片而不是一个网页或是一个json

所以我们也就不用用到selenium模块了,当然有兴趣的同学也一样可以使用selenium去爬取。

为了方便我们就用requests模块就够了,因为够快。。。

上章的课程传送门:

[python网络爬虫之入门[一]](https://www.cnblogs.com/liwangwang/p/11977110.html)
[python网络爬虫之自动化测试工具selenium\[二\]](https://www.cnblogs.com/liwangwang/p/11977134.html)

理一下本章思路:

  1. 学习并掌握好正则表达式
  2. 使用正则表达式去分析网站来获取特定信息

一、正则表达式的学习

1、正则表达式的匹配工具

如果是学过正则表达式的却不知道这个工具的话,那绝对是一个很大的遗憾。

这个也叫做猫头鹰,

可能还有一些比较好用的工具把,但这个就已经够用了,

下载路径:

链接:https://pan.baidu.com/s/1g8Zn-CKopsnCjA_o9jS0TQ
提取码:iq9s

2、正则表达式的样式

本着大家好,我好的思想理念,所以我觉得给大家起一个匹配案例就行了,其他的正则自己可以慢慢看代码理解
放图:

使用regexbuddy做检测:

失败案例

在python中的一个测试

3、正则表达式的案例

"""
正则表达式 """
import re str = "Liwangwang321@163.com" # 匹配所有邮箱
# f = re.match("^\w{4,20}@\w+\.com$",str) # 匹配qq或163邮箱
# f = re.match("\w{4,20}@(qq|163)\.com",str) # 匹配<div><span>python</span></div> \num方法
# str = "<div><span>python</span></div>"
# f = re.match("<([A-Za-z]+)><([A-Za-z]+)>.*</\\2></\\1>",str) # 匹配<div><span>python</span></div> 起别名方法
str = "<div><span>python</span></div>"
f = re.match("<(?P<name1>[A-Za-z]+)><(?P<name2>[A-Za-z]+)>.*</(?P=name2)></(?P=name1)>",str) # 2、match和search的区别
# str = "你好,123,现在在线人数为9999"
# f = re.match("\\d*",str)
# f = re.search(",\\d*",str)
# f = re.findall("\\d*",str) # 3、贪婪与非贪婪 :加个?就行
# f = re.findall('src=".*"',str)
# f = re.findall('src=".*?"',str) # 4、免写转义\\ : 加个r
# f = re.match(r"<([A-Za-z]+)><([A-Za-z]+)>.*</\2></\1>",str) if f:
print("匹配成功")
print(f.group())
# for i in f:
# print(i)
else:
print("匹配失败")

二、爬取网页图片

1、分析网页

我们此次爬取的对象为http://pic.netbian.com/4kdongma

获取指定的图片查看:

但是呢,一个展示图片根本不能符合我们的要求,

所以我们点击进去看看:

F12检索网页代码;

ok,我们查看一下这个图片路径http://pic.netbian.com/uploads/allimg/180222/231102-151931226201f1.jpg

接下来就是去分析一个网页的结构,确定好用什么正则表达式才能准确的拿到a标签的href,或者img标签的src

这个非常重要,重要,重要!!

比如

ok,一步一步的分析网页结构:

那么接下来的那个点击进去之后的html路经,我们照样可以通过这个方法访问,解析

下面自己测试  

import requests
import re
from fake_useragent import UserAgent
ua = UserAgent(verify_ssl=False)
headers = {
"Cookie": "__cfduid=d475437d729908631eff1e1d69f0314c81574259376; zkhanecookieclassrecord=%2C66%2C; Hm_lvt_526caf4e20c21f06a4e9209712d6a20e=1574259380,1574691901,1574734052; security_session_verify=ebb4b36dc44da23d2cdd02fa4650ae15; Hm_lpvt_526caf4e20c21f06a4e9209712d6a20e=1574735387"
,
"User-Agent": ua.random
} rep = requests.get("http://pic.netbian.com/4kdongman/index.html", headers=headers, verify=False)
rep.encoding="gbk"
# result = """<a href="(.*?)" target="_blank"><img src=".*?" alt=".*?" /><b>.*?</b></a>"""
# 拿一个正则表达式去匹配
# contents = re.findall(result, rep.text) print(rep.text)
# for content in contents:
# print(content)

2、获取数据

我们先看一下图解:

全部代码

"""
爬取4k动漫图片 """
import requests
import time
import os
import re from fake_useragent import UserAgent
ua = UserAgent(verify_ssl=False) headers = {
"Cookie": "__cfduid=d475437d729908631eff1e1d69f0314c81574259376; zkhanecookieclassrecord=%2C66%2C; Hm_lvt_526caf4e20c21f06a4e9209712d6a20e=1574259380,1574691901,1574734052; security_session_verify=645e98edf446fb2efa862d275906b0ba; Hm_lpvt_526caf4e20c21f06a4e9209712d6a20e=1574782670"
,
"User-Agent": ua.random
}
# 获取当前目录
root = os.getcwd() # range此参数可以自己更改,第几页到第几页
for page in range(0, 125):
# 进入当前目录
os.chdir(root)
# 创建文件夹
os.mkdir(f"4k动漫的第{page+1}页") # 改变当前文件目录
os.chdir(f"4k动漫的第{page+1}页")
if page+1 == 1:
url = f"http://pic.netbian.com/4kdongman/index.html"
else:
url = f"http://pic.netbian.com/4kdongman/index_{page + 1}.html" response = requests.get(url,headers=headers,verify=False)
response.encoding="gbk" if response.status_code == 200 :
result= """<a href="(.*?)" target="_blank"><img src=".*?" alt=".*?" /><b>.*?</b></a>"""
# 拿一个正则表达式去匹配
contents = re.findall(result,response.text)
# 去遍历所有的图片
for content in contents:
path = content
print(f"{path}正在进入html......")
response2 = requests.get("http://pic.netbian.com"+path, headers=headers,verify=False)
response2.encoding = "gbk"
time.sleep(1)
result2 = """<a href="" id="img"><img src="(.*?)" data-pic=".*?" alt="(.*?)" title=".*?"></a>"""
contents2 = re.findall(result2, response2.text)
for content2 in contents2:
path2 = content2[0]
name = content2[1]
response3 = requests.get("http://pic.netbian.com"+path2, headers=headers,verify=False)
# 保存到本地
with open(f"{name}.jpg","wb") as f:
f.write(response3.content)
print(f"{name} : {path2} 保存成功,等待1秒后继续爬取")
time.sleep(1)
print(f"第{page + 1}页抓取成功,,等待2秒后继续爬取")
time.sleep(2)

爬取妹子网的案例

这个案例来自于:https://blog.csdn.net/qq_33958297/article/details/89388556

爬取的网站:https://www.mzitu.com/

# -*- coding: utf-8 -*-

import requests
import os
from lxml import etree
from threading import *
from time import sleep nMaxThread = 3 #这里设置需要开启几条线程
ThreadLock = BoundedSemaphore(nMaxThread) gHeads = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
} class Meizitu(Thread):
def __init__(self,url,title):
Thread.__init__(self)
self.url = url #这里的url在后面的referer中需要使用
self.title = title def run(self):
try:
PhotoUrl,Page = self.GetPhotoUrlAndPageNum()
if PhotoUrl and Page > 0:
self.SavePhoto(PhotoUrl,Page)
finally:
ThreadLock.release() def GetPhotoUrlAndPageNum(self):
html = requests.get(self.url,headers=gHeads)
if html.status_code == 200:
xmlContent = etree.HTML(html.text)
PhotoUrl = xmlContent.xpath("//div[@class='main-image']/p/a/img/@src")[0][:-6] #01.jpg 正好是-6
PageNum = xmlContent.xpath("//div[@class='pagenavi']/a[5]/span/text()")[0]
return PhotoUrl,int(PageNum)
else:
return None,None def SavePhoto(self,url,page):
savePath = "./photo/%s" % self.title
if not os.path.exists(savePath):
os.makedirs(savePath)
for i in range(page):
heads = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Referer": "%s/%d" %(self.url,i+1),
"Accept": "image/webp,image/apng,image/*,*/*;q=0.8"
}
j = 0
while j<5:
print (u"Download : %s/%d.jpg" % (self.title, i + 1))
html = requests.get("%s%02d.jpg"%(url,i+1),headers=heads)
if html.status_code == 200:
with open(savePath + "/%d.jpg"%(i+1),"wb") as f:
f.write(html.content)
break
elif html.status_code == 404:
j+=1
sleep(0.05)
continue
else:
return None def main():
while True:
try:
nNum = int(raw_input(u"请输入要下载几页: "))
if nNum>0:
break
except ValueError:
print(u"请输入数字。")
continue
for i in range(nNum):
url = "https://www.mzitu.com/xinggan/page/%d/"%(i+1)
html = requests.get(url,headers=gHeads)
if html.status_code == 200:
xmlContent = etree.HTML(html.content)
hrefList = xmlContent.xpath("//ul[@id='pins']/li/a/@href")
titleList = xmlContent.xpath("//ul[@id='pins']/li/a/img/@alt")
for i in range(len(hrefList)):
ThreadLock.acquire()
t = Meizitu(hrefList[i],titleList[i])
t.start() if __name__ == '__main__':
main()

后记

如果有正则基础的可以直接看如何爬取,没有的可以学一学。

不过regexbuddy工具都可以玩玩看

如果感觉本章写的还不错的话,不如。。。。。(~ ̄▽ ̄)~ ,(´▽`ʃ♡ƪ)

python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]的更多相关文章

  1. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  2. python网络爬虫之解析网页的XPath(爬取Path职位信息)[三]

    目录 前言 XPath的使用方法 XPath爬取数据 后言 @(目录) 前言 本章同样是解析网页,不过使用的解析技术为XPath. 相对于之前的BeautifulSoup,我感觉还行,也是一个比较常用 ...

  3. Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页

    通过网站地图爬取目标站点的所有网页 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 ...

  4. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据

    又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...

  5. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  6. 一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取

    前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌 ...

  7. ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中

    1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...

  8. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  9. Python网络爬虫数据解析的三种方式

    request实现数据爬取的流程: 指定url 基于request发起请求 获取响应的数据 数据解析 持久化存储 1.正则解析: 常用的正则回顾:https://www.cnblogs.com/wqz ...

随机推荐

  1. kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...

  2. SpringBoot是如何启动的?

    本文是通过查看SpringBoot源码整理出来的SpringBoot大致启动流程,整体大方向是以简单为出发点,不说太多复杂的东西,内部实现细节本文不深扣因为每个人的思路.理解都不一样,我个人看的理解跟 ...

  3. 第六篇 视觉slam中的优化问题梳理及雅克比推导

    优化问题定义以及求解 通用定义 解决问题的开始一定是定义清楚问题.这里引用g2o的定义. \[ \begin{aligned} \mathbf{F}(\mathbf{x})&=\sum_{k\ ...

  4. 我跟上家老板说过的最后一句话:转.NET Core吧

    最近几天浩子终于刚刚脱离了令人发指工作,一者是年底了,一者是不要向生活低头,就在这时我选择了第二者. 上家是做物联网的,人数不多,七八名开发人员,感觉都还可以,都很年轻没有秃顶,糊里糊涂就选择了入职. ...

  5. mysql-清除binlog日志命令

    记录一个清除MySQL里binlog日志的命令,可用在定时任务脚本里. 只保留1天前的日志: PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTER ...

  6. 「POJ 3268」Silver Cow Party

    更好的阅读体验 Portal Portal1: POJ Portal2: Luogu Description One cow from each of N farms \((1 \le N \le 1 ...

  7. 开发板,pc,虚拟机三者如何互相ping通

    1 安装虚拟机时,主机和虚拟机必须是桥接网卡,保证了ip 同一:192,168,1,xx 2 打开虚拟机之前,先把pc机的无线网卡禁用掉只能使用本地连接,pc通过网线连接上网,打开虚拟机,命令行输入: ...

  8. JavaScript文档对象模型(DOM)——DOM核心操作

    文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或XML)的标准编程接口. W3C已经定义了一系列DOM接口,通过这些DOM接口可 ...

  9. [LC]530题 二叉搜索树的最小绝对差

    ①题目 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例 : 输入: 1   \   3  / 2 输出:1 解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  10. VMware安装Ubuntu 16.04.4 LTS

    1.下载Ubuntu镜像 https://www.ubuntu.com/download/desktop 2.创建新的虚拟机 3. 4.这里默认即可,可以不选 5. 6. 7.这里位置可以随时改 8. ...