妹子图网站---- 安装requests打开终端:使用命令pip3 install requests等待安装完毕即可使用接下来在终端中键入如下命令?123# mkdir demo # cd demo# touch down.py上面的linux命令是 创建一个名称为demo的文件夹,之后创建一个down.py文件,你也可以使用GUI工具,像操作windows一样,右键创建各种文件。为了提高在linux上的开发效率,我们需要安装一个visual studio code的开发工具对于怎么安装vscode,参考官方的https://code.visualstudio.com...有详细的说明。对于centos则如下:?12sudo rpm --import https://packages.microsoft.com/keys/microsoft.ascsudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'然后用yum命令安装?12yum check-updatesudo yum install code安装成功之后,在你的CentOS中会出现如下画面vcmlnaW5hbC1zcmM9"//upload-images.jianshu.io/upload_images/17837070-26e15b3e91596710.png" data-original-width="428" data-original-height="207" data-original-format="image/png" data-original-filesize="35567" />接着说我们上面的操作 ,因为我们这边是用gnome图形界面,所以后面的有些操作,我直接用windows的操作风格讲解了打开软件>文件>打开文件>找到我们刚刚创建的down.py文件之后,在VSCODE里面输入ips:本教程不是Python3的基础入门课,所以有些编码基础,默认你懂,比如Python没有分号结尾,需要对齐格式。我会尽量把注释写的完整按键盘上的ctrl+s保存文件,如果提示权限不足,那么按照提示输入密码即可通过终端进入demo目录,然后输入python3 down.py显示如下结果,代表编译没有问题[root@bogon demo]# python3 down.py跑码文件接下来,我们开始测试requests模块是否可以使用修改上述代码中的运行结果(出现下图代表你运行成功了):接下来,我们实际下载一张图片试试,比如下面这张图片学习python爬虫过程中有不懂的可以加入我的python零基础系统学习交流秋秋qun:934109170,与你分享Python企业当下人才需求及怎么从零基础学习Python,和学习什么内容。相关学习视频资料、开发工具都有分享修改代码,在这之前,我们修改一些内容由于每次修改文件,都提示必须管理员权限,所以你可以使用linux命令修改权限。[root@bogon linuxboy]# chmod -R 777 demo/运行代码之后,发现在文件夹内部生成了一个文件但是打开文件之后发现,这个文件并不能查阅,这代表这个文件压根没有下载下来我们继续修改代码,因为有的服务器图片,都做了一些限制,我们可以用浏览器打开,但是使用Python代码并不能完整的下载下来。

<code class = "python" > import requests
def run():
# 头文件,header是字典类型
headers = {
"Host" : "www.newsimg.cn" ,
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5383.400 QQBrowser/10.0.1313.400"
}
response = requests.get( "www.newsimg.cn/big201710le…" ,headers=headers)
with open( "a.jpg" , "wb" ) as f :
f.write(response.content)
f.close()
if __name__ == "__main__" :
run()
</code>


好了,这次在终端编译一下python文件python3 down.py发现图片下载下来了我们重点查看上述代码中requests.get部分,添加了一个headers的实参。这样我们程序就下载下来了完整的图片。妹子图网站---- Python爬虫页面分析有了上面这个简单的案例,我们接下来的操作就变的简单多了。爬虫是如何进行的呢?输入域名->下载源代码->分析图片路径->下载图片上面就是他的步骤输入域名我们今天要爬的网站叫做https://www.meizitu.com/a/pure...为啥爬取这个网站,因为好爬。好了,接下来分析这个页面做爬虫很重要的一点,就是你要找到分页的地方,因为有分页代表着有规律,有规律,我们就好爬了(可以做的更智能一些,输入首页网址,爬虫自己就能分析到这个网站中的所有地址)上面图片中,我们发现了分页,那么找规律吧使用火狐浏览器的开发者工具,发现分页规律好了,接下来用Python实现这部分(以下写法有部分面向对象的写法,没有基础的同学,请百度找些基础来看,不过对于想学习的你来说,这些简单极了)import requestsall_urls = [] #我们拼接好的图片集和列表路径class Spider():#构造函数,初始化数据使用def __init__(self,target_url,headers):self.target_url = target_urlself.headers = headers#获取所有的想要抓取的URLdef getUrls(self,start_page,page_num):global all_urls#循环得到URLfor i in range(start_page,page_num+1):url = self.target_url % iall_urls.append(url)if __name__ == "__main__":headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0','HOST':'www.meizitu.com'}target_url = 'https://www.meizitu.com/a/pure_%d.html' #图片集和列表规则spider = Spider(target_url,headers)spider.getUrls(1,16)print(all_urls)上面的代码,可能需要有一定的Python基础可以看懂,不过你其实仔细看一下,就几个要点第一个是class Spider():我们声明了一个类,然后我们使用def __init__去声明一个构造函数,这些我觉得你找个教程30分钟也就学会了。拼接URL,我们可以用很多办法,我这里用的是最直接的,字符串拼接。注意上述代码中有一个全局的变量all_urls我用它来存储我们的所有分页的URL接下来,是爬虫最核心的部分代码了我们需要分析页面中的逻辑。首先打开https://www.meizitu.com/a/pure...,右键审查元素。发现上图红色框框里面的链接点击图片之后,发现进入一个图片详情页面,发现竟然是一组图片,那么现在的问题是我们要解决第一步,需要在https://www.meizitu.com/a/pure...这种页面中爬取所有的https://www.meizitu.com/a/5585...这种地址这里我们采用多线程的方式爬取(这里还用了一种设计模式,叫观察者模式)首先引入三个模块,分别是多线程,正则表达式,时间模块新增加一个全局的变量,并且由于是多线程操作,我们需要引入线程锁声明一个生产者的类,用来不断的获取图片详情页地址,然后添加到all_img_urls这个全局变量中#生产者,负责从每个页面提取图片列表链接class Producer(threading.Thread):def run(self):headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0','HOST':'www.meizitu.com'}global all_urlswhile len(all_urls) > 0 :g_lock.acquire() #在访问all_urls的时候,需要使用锁机制page_url = all_urls.pop() #通过pop方法移除最后一个元素,并且返回该值g_lock.release() #使用完成之后及时把锁给释放,方便其他线程使用try:print("分析"+page_url)response = requests.get(page_url , headers = headers,timeout=3)all_pic_link = re.findall('',response.text,re.S)global all_img_urlsg_lock.acquire() #这里还有一个锁all_img_urls += all_pic_link #这个地方注意数组的拼接,没有用append直接用的+=也算是python的一个新语法吧print(all_img_urls)g_lock.release() #释放锁time.sleep(0.5)except:pass上述代码用到了继承的概念,我从threading.Thread中继承了一个子类,继承的基础学习线程锁,在上面的代码中,当我们操作all_urls.pop()的时候,我们是不希望其他线程对他进行同时操作的,否则会出现意外,所以我们使用g_lock.acquire()锁定资源,然后使用完成之后,记住一定要立马释放g_lock.release(),否则这个资源就一直被占用着,程序无法进行下去了。匹配网页中的URL,我使用的是正则表达式,后面我们会使用其他的办法,进行匹配。re.findall()方法是获取所有匹配到的内容,正则表达式,你可以找一个30分钟入门的教程,看看就行。代码容易出错的地方,我放到了try: except: 里面,当然,你也可以自定义错误。如果上面的代码,都没有问题,那么我们就可以在程序入口的地方编写执行程序,因为我们的Producer继承自threading.Thread类,所以,你必须要实现的一个方法是def run这个我相信在上面的代码中,你已经看到了。然后我们可以执行啦~~~运行结果:这样,图片详情页面的列表就已经被我们存储起来了。接下来,我们需要执行这样一步操作,我想要等待图片详情页面全部获取完毕,在进行接下来的分析操作。这里增加代码#threads= []#开启两个线程去访问for x in range(2):t = Producer()t.start()#threads.append(t)# for tt in threads:# tt.join()print("进行到我这里了")注释关键代码,运行如下[linuxboy@bogon demo]$ python3 down.py分析https://www.meizitu.com/a/pure_2.html分析https://www.meizitu.com/a/pure_1.html进行到我这里了['https://www.meizitu.com/a/5585.html',把上面的tt.join等代码注释打开[linuxboy@bogon demo]$ python3 down.py分析https://www.meizitu.com/a/pure_2.html分析https://www.meizitu.com/a/pure_1.html['https://www.meizitu.com/a/5429.html', ......进行到我这里了发现一个本质的区别,就是,我们由于是多线程的程序,所以,当程序跑起来之后,print("进行到我这里了")不会等到其他线程结束,就会运行到,但是当我们改造成上面的代码之后,也就是加入了关键的代码tt.join()那么主线程的代码会等到所以子线程运行完毕之后,在接着向下运行。这就满足了,我刚才说的,先获取到所有的图片详情页面的集合,这一条件了。join所完成的工作就是线程同步,即主线程遇到join之后进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在继续执行。这个大家在以后可能经常会碰到。下面编写一个消费者/观察者,也就是不断关注刚才我们获取的那些图片详情页面的数组。添加一个全局变量,用来存储获取到的图片链接#消费者class Consumer(threading.Thread) :def run(self):headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0','HOST':'www.meizitu.com'}global all_img_urls #调用全局的图片详情页面的数组print("%s is running " % threading.current_thread)while len(all_img_urls) >0 :g_lock.acquire()img_url = all_img_urls.pop()g_lock.release()try:response = requests.get(img_url , headers = headers )response.encoding='gb2312' #由于我们调用的页面编码是GB2312,所以需要设置一下编码title = re.search('',response.text).group(1)all_pic_src = re.findall('pic_dict = {title:all_pic_src} #python字典global pic_linksg_lock.acquire()pic_links.append(pic_dict) #字典数组print(title+" 获取成功")g_lock.release()except:passtime.sleep(0.5)看到没有,上面的代码其实和我们刚才写的极其相似,后面,我会在github上面把这部分代码修改的更加简洁一些,不过这才是第二课,后面我们的路长着呢。代码中比较重要的一些部分,我已经使用注释写好了,大家可以直接参考。大家一定要注意我上面使用了两个正则表达式,分别用来匹配title和图片的url这个title是为了后面创建不同的文件夹使用的,所以大家注意吧。运行结果:是不是感觉距离成功有进了一大步接下来就是,我们开篇提到的那个存储图片的操作了,还是同样的步骤,写一个自定义的类class DownPic(threading.Thread) :def run(self):headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0','HOST':'mm.chinasareview.com'}while True: # 这个地方写成死循环,为的是不断监控图片链接数组是否更新global pic_links# 上锁g_lock.acquire()if len(pic_links) == 0: #如果没有图片了,就解锁# 不管什么情况,都要释放锁g_lock.release()continueelse:pic = pic_links.pop()g_lock.release()# 遍历字典列表for key,values in pic.items():path=key.rstrip("\\")is_exists=os.path.exists(path)# 判断结果if not is_exists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)print (path+'目录创建成功')else:# 如果目录存在则不创建,并提示目录已存在print(path+' 目录已存在')for pic in values :filename = path+"/"+pic.split('/')[-1]if os.path.exists(filename):continueelse:response = requests.get(pic,headers=headers)with open(filename,'wb') as f :f.write(response.content)f.close我们获取图片链接之后,就需要下载了,我上面的代码是首先创建了一个之前获取到title的文件目录,然后在目录里面通过下面的代码,去创建一个文件。涉及到文件操作,引入一个新的模块# 遍历字典列表for key,values in pic.items():path=key.rstrip("\\")is_exists=os.path.exists(path)# 判断结果if not is_exists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)print (path+'目录创建成功')else:# 如果目录存在则不创建,并提示目录已存在print(path+' 目录已存在')for pic in values :filename = path+"/"+pic.split('/')[-1]if os.path.exists(filename):continueelse:response = requests.get(pic,headers=headers)with open(filename,'wb') as f :f.write(response.content)f.close我们获取图片链接之后,就需要下载了,我上面的代码是首先创建了一个之前获取到title的文件目录,然后在目录里面通过下面的代码,去创建一个文件。涉及到文件操作,引入一个新的模块# 遍历字典列表for key,values in pic.items():path=key.rstrip("\\")is_exists=os.path.exists(path)# 判断结果if not is_exists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)print (path+'目录创建成功')else:# 如果目录存在则不创建,并提示目录已存在print(path+' 目录已存在')for pic in values :filename = path+"/"+pic.split('/')[-1]if os.path.exists(filename):continueelse:response = requests.get(pic,headers=headers)with open(filename,'wb') as f :f.write(response.content)f.close因为我们的图片链接数组,里面存放是的字典格式,也就是下面这种格式[{"妹子图1":["https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/01.jpg","https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/02.jpg"."https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/03.jpg"]},{"妹子图2":["https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/01.jpg","https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/02.jpg"."https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/03.jpg"]},{"妹子图3":["https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/01.jpg","https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/02.jpg"."https://mm.chinasareview.com/wp-content/uploads/2016a/08/24/03.jpg"]}]需要先循环第一层,获取title,创建目录之后,在循环第二层去下载图片,代码中,我们在修改一下,把异常处理添加上。然后在主程序中编写代码运行结果:[linuxboy@bogon demo]$ python3 down.py分析https://www.meizitu.com/a/pure_2.html分析https://www.meizitu.com/a/pure_1.html['https://www.meizitu.com/a/5585.html', 'https://www.meizitu.com/a/5577.html', 'https://www.meizitu.com/a/5576.html', 'https://www.meizitu.com/a/5574.html', 'https://www.meizitu.com/a/5569.html', .......is runningis runningis running进行到我这里了清纯妹子如一缕阳光温暖这个冬天 获取成功清纯妹子如一缕阳光温暖这个冬天目录创建成功可爱女孩,愿暖风呵护纯真和执着 获取成功可爱女孩,愿暖风呵护纯真和执着目录创建成功超美,纯纯的你与蓝蓝的天相得益彰 获取成功超美,纯纯的你与蓝蓝的天相得益彰目录创建成功美丽冻人,雪地里的跆拳道少女 获取成功五官精致的美眉,仿佛童话里的公主 获取成功有自信迷人的笑容,每天都是灿烂的 获取成功五官精致的美眉,仿佛童话里的公主目录创建成功有自信迷人的笑容,每天都是灿烂的目录创建成功清纯美如画,摄影师的御用麻豆 获取成功文件目录下面同时出现点开一个目录好了,今天的一个简单的爬虫成了最后我们在代码的头部写上# -*- coding: UTF-8 -*-防止出现Non-ASCII character 'xe5' in file报错问题。

Python爬虫

转载于:https://juejin.im/post/5d0b45e06fb9a07ee742e511

Python爬虫入门教程:爬取妹子图网站 - 独行大佬相关推荐

  1. python多线程爬取多个网址_【Python爬虫】多线程爬取斗图网站(皮皮虾,我们上车)...

    原标题:[Python爬虫]多线程爬取斗图网站(皮皮虾,我们上车) 斗图我不怕 没有斗图库的程序猿是无助,每次在群里斗图都以惨败而告终,为了能让自己在斗图界立于不败之地,特意去网上爬取了斗图包.在这里 ...

  2. python爬虫入门教程-Python爬虫入门教程——爬取自己的博客园博客

    互联网时代里,网络爬虫是一种高效地信息采集利器,可以快速准确地获取网上的各种数据资源.本文使用Python库requests.Beautiful Soup爬取博客园博客的相关信息,利用txt文件转存. ...

  3. python爬虫教程-Python爬虫入门教程——爬取自己的博客园博客

    互联网时代里,网络爬虫是一种高效地信息采集利器,可以快速准确地获取网上的各种数据资源.本文使用Python库requests.Beautiful Soup爬取博客园博客的相关信息,利用txt文件转存. ...

  4. Python爬虫入门(爬取豆瓣电影信息小结)

    Python爬虫入门(爬取豆瓣电影信息小结) 1.爬虫概念 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或脚本.爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据. 2.基本流程 ...

  5. Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 小猪短租(成都)页面:http://cd.xiaozhu.com/   1.爬取租房标题 ...

  6. Python爬虫入门 | 4 爬取豆瓣TOP250图书信息

      先来看看页面长啥样的:https://book.douban.com/top250   我们将要爬取哪些信息:书名.链接.评分.一句话评价--   1. 爬取单个信息 我们先来尝试爬取书名,利用之 ...

  7. python爬虫入门(一)爬取钓鱼吧

    python爬虫入门(一)爬取钓鱼吧 # Date : 2022/1/1 17:11 ''' 需求:1.输入贴吧名称:钓鱼吧https://tieba.baidu.com/f?kw=钓鱼吧&p ...

  8. python 爬虫入门--文字爬取

    python 爬虫入门–文字爬取 对于爬虫,相信大家都不陌生,但是如何入门,大家还是停留在了解认知阶段吗?那可以试试下边的方法,一起来试一下. 首先我们试试爬取网页中的***文本信息*** 使用的是我 ...

  9. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

最新文章

  1. Setting Up Tomcat For Remote Debugging
  2. python400集视频教程 百度云-Python自动化测试视频教程【百度云盘下载】
  3. 在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言)
  4. dotcpp1115 DNA-打印图案
  5. 优酷视频如何将地区设置为中国大陆
  6. 作者:佟继周(1976-),女,中国科学院国家空间科学中心研究室副研究员、副主任...
  7. centos7/rhel7下安装redis4.0集群
  8. 刷新table数据_关于数据透视表的刷新功能最值得了解的几个操作
  9. 3.11 Ext JS 下拉框(Combobox)使用
  10. 关于【bootstrap modal 模态框弹出瞬间消失的问题】
  11. layer使用心得3
  12. 自媒体平台数据统计分析爬虫之【一点号】模拟登陆分析详解及数据统计接口详解
  13. 第12届信息化领袖峰会丨行程安排新鲜出炉
  14. 理解深度学习中的卷积
  15. JSON字符串的使用
  16. kill进程的几种方法
  17. Oracle索引比表大
  18. android telnet服务器端,Android FTP客户端实现、Telnet客户端
  19. python numpy读取数据_Python numpy数据的保存和读取
  20. 最短增广路Isap算法 网络流

热门文章

  1. 【动态规划】Problem 4 聪明伶俐的香穗子
  2. mysql主键索引和普通索引之间的区别
  3. Linux文件重命名批量操作(截取特定位置的字符)
  4. Fiduccia-Mattheyses algorithm(FM算法)
  5. PowerDesigner16.5安装图解
  6. 量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)
  7. 流利阅读12.30 The 20 best Marvel films – ranked!
  8. 《讲个故事》七个小矮人 与 七层模型
  9. 商标查询api 模糊查询商标列表
  10. 电玩设计无孔不入:摇杆造型、可发声的电灯开关