要说最美好的欲望莫过于看黑丝美眉。
一、技术路线
requests:网页请求
BeautifulSoup:解析html网页
re:正则表达式,提取html网页信息
os:保存文件
import re
import requests
import os
from bs4 import BeautifulSoup
二、获取网页信息
获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,‘欺骗’网站不被发现
def getHtml(url): #固定格式,获取html内容headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'} #模拟用户操作try:r = requests.get(url, headers=headers)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print('网络状态错误')
三、网页爬取分析
右键单击图片区域,选择 审查元素 ,可以查看当前网页图片详情链接,我就满心欢喜的复制链接打开保存,看看效果,结果一张图片只有60几kb,这就是缩略图啊,不清晰,果断舍弃。。。
<图片放不出来啊啊啊~~~>
没有办法&#xff0c;只有点击找到详情页链接&#xff0c;再进行单独爬取。
空白右键&#xff0c;查看页面源代码&#xff0c;把刚刚复制的缩略图链接复制查找快速定位&#xff0c;分析所有图片详情页链接存在div标签&#xff0c;并且class&#61;‘list’ 唯一&#xff0c;因此可以使用BeautifulSoup提取此标签。并且发现图片详情页链接在herf&#61;后面&#xff08;同时我们注意到有部分无效链接也在div标签中&#xff0c;观察它们异同&#xff0c;发现无效链接存在&#39;https&#39;字样&#xff0c;因此可在代码中依据此排出无效链接&#xff0c;对应第4条中的函数代码&#xff09;&#xff0c;只需提取出来再在前面加上网页首页链接即可打开&#xff0c;并且右键图片&#xff0c;‘审查元素’&#xff0c;复制链接下载的图片接近1M&#xff0c;表示是高清图片了&#xff0c;到这一步我们只需调用下载保存函数即可保存图片
四、网页详情页链接获取
首要目标是将每页的每个图片的详情页链接给爬取下来&#xff0c;为后续的高清图片爬取做准备&#xff0c;这里直接使用定义函数def getUrlList(url)
def getUrlList(url): # 获取图片链接url_list &#61; [] #存储每张图片的url&#xff0c;用于后续内容爬取demo &#61; getHtml(url)soup &#61; BeautifulSoup(demo,&#39;html.parser&#39;)sp &#61; soup.find_all(&#39;div&#39;, class_&#61;"list") #class&#61;&#39;list&#39;在全文唯一&#xff0c;因此作为锚&#xff0c;获取唯一的div标签&#xff1b;注意&#xff0c;这里的网页源代码是class&#xff0c;但是python为了和class&#xff08;类&#xff09;做区分&#xff0c;在最后面添加了_nls &#61; re.findall(r&#39;a href&#61;"(.*?)" rel&#61;"external nofollow" rel&#61;"external nofollow" &#39;, str(sp)) #用正则表达式提取链接for i in nls:if &#39;https&#39; in i: #因所有无效链接中均含有&#39;https&#39;字符串&#xff0c;因此直接剔除无效链接&#xff08;对应第3条的分析&#xff09;continueurl_list.append(&#39;http://www.netbian.com&#39; &#43; i) #在获取的链接中添加前缀&#xff0c;形成完整的有效链接return url_list
五、依据图片链接保存图片
通过上面获取了每个图片的详情页链接后&#xff0c;打开&#xff0c;右键图片审查元素&#xff0c;复制链接即可快速定位&#xff0c;然后保存图片
def fillPic(url,page):pic_url &#61; getUrlList(url) #调用函数&#xff0c;获取当前页的所有图片详情页链接path &#61; &#39;./美女&#39; # 保存路径for p in range(len(pic_url)):pic &#61; getHtml(pic_url[p])soup &#61; BeautifulSoup(pic, &#39;html.parser&#39;)psoup &#61; soup.find(&#39;div&#39;, class_&#61;"pic") #class_&#61;"pic"作为锚&#xff0c;获取唯一div标签&#xff1b;注意&#xff0c;这里的网页源代码是class&#xff0c;但是python为了和class&#xff08;类&#xff09;做区分&#xff0c;在最后面添加了_picUrl &#61; re.findall(r&#39;src&#61;"(.*?)"&#39;, str(psoup))[0] #利用正则表达式获取详情图片链接&#xff0c;因为这里返回的是列表形式&#xff0c;所以取第一个元素&#xff08;只有一个元素&#xff0c;就不用遍历的方式了&#xff09;pic &#61; requests.get(picUrl).content #打开图片链接&#xff0c;并以二进制形式返回&#xff08;图片&#xff0c;声音&#xff0c;视频等要以二进制形式打开&#xff09;image_name &#61;&#39;美女&#39; &#43; &#39;第{}页&#39;.format(page) &#43; str(p&#43;1) &#43; &#39;.jpg&#39; #给图片预定名字image_path &#61; path &#43; &#39;/&#39; &#43; image_name #定义图片保存的地址with open(image_path, &#39;wb&#39;) as f: #保存图片f.write(pic)print(image_name, &#39;下载完毕&#xff01;&#xff01;&#xff01;&#39;)
六、main()函数
经过前面的主体框架搭建完毕之后&#xff0c;对整个程序做一个前置化&#xff0c;直接上代码
在这里第1页的链接是
www.netbian.com/meinv/
第2页的链接是
www.netbian.com/meinv/index…
并且后续页面是在第2页的基础上仅改变最后的数字&#xff0c;因此在写代码的时候要注意区分第1页和后续页面的链接&#xff0c;分别做处理&#xff1b;同时在main()函数还增加了自定义爬取页数的功能&#xff0c;详见代码
<图片放不出来啊啊啊~~~>
def main():n &#61; input(&#39;请输入要爬取的页数&#xff1a;&#39;)url &#61; &#39;http://www.netbian.com/meinv/&#39; # 资源的首页&#xff0c;可根据自己的需求查看不同分类&#xff0c;自定义改变目录&#xff0c;爬取相应资源if not os.path.exists(&#39;./美女&#39;): # 如果不存在&#xff0c;创建文件目录os.mkdir(&#39;./美女/&#39;)page &#61; 1fillPic(url, page) # 爬取第一页&#xff0c;因为第1页和后续页的链接的区别&#xff0c;单独处理第一页的爬取if int(n) >&#61; 2: #爬取第2页之后的资源ls &#61; list(range(2, 1 &#43; int(n)))url &#61; &#39;http://www.netbian.com/meinv/&#39;for i in ls: #用遍历的方法对输入的需求爬取的页面做分别爬取处理page &#61; str(i)url_page &#61; &#39;http://www.netbian.com/meinv/&#39;url_page &#43;&#61; &#39;index_&#39; &#43; page &#43; &#39;.htm&#39; #获取第2页后的每页的详情链接fillPic(url, page) #调用fillPic()函数
七、完整代码
最后再调用main()&#xff0c;输入需要爬取的页数&#xff0c;即可开始爬取&#xff0c;完整代码如下
import re
import requests
import os
from bs4 import BeautifulSoupdef getHtml(url): #固定格式&#xff0c;获取html内容headers &#61; {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&#39;} #模拟用户操作try:r &#61; requests.get(url, headers&#61;headers)r.raise_for_status()r.encoding &#61; r.apparent_encodingreturn r.textexcept:print(&#39;网络状态错误&#39;)def getUrlList(url): # 获取图片链接url_list &#61; [] #存储每张图片的url&#xff0c;用于后续内容爬取demo &#61; getHtml(url)soup &#61; BeautifulSoup(demo,&#39;html.parser&#39;)sp &#61; soup.find_all(&#39;div&#39;, class_&#61;"list") #class&#61;&#39;list&#39;在全文唯一&#xff0c;因此作为锚&#xff0c;获取唯一的div标签&#xff1b;注意&#xff0c;这里的网页源代码是class&#xff0c;但是python为了和class&#xff08;类&#xff09;做区分&#xff0c;在最后面添加了_nls &#61; re.findall(r&#39;a href&#61;"(.*?)" rel&#61;"external nofollow" rel&#61;"external nofollow" &#39;, str(sp)) #用正则表达式提取链接for i in nls:if &#39;https&#39; in i: #因所有无效链接中均含有&#39;https&#39;字符串&#xff0c;因此直接剔除无效链接&#xff08;对应第3条的分析&#xff09;continueurl_list.append(&#39;http://www.netbian.com&#39; &#43; i) #在获取的链接中添加前缀&#xff0c;形成完整的有效链接return url_listdef fillPic(url,page):pic_url &#61; getUrlList(url) #调用函数&#xff0c;获取当前页的所有图片详情页链接path &#61; &#39;./美女&#39; # 保存路径for p in range(len(pic_url)):pic &#61; getHtml(pic_url[p])soup &#61; BeautifulSoup(pic, &#39;html.parser&#39;)psoup &#61; soup.find(&#39;div&#39;, class_&#61;"pic") #class_&#61;"pic"作为锚&#xff0c;获取唯一div标签&#xff1b;注意&#xff0c;这里的网页源代码是class&#xff0c;但是python为了和class&#xff08;类&#xff09;做区分&#xff0c;在最后面添加了_picUrl &#61; re.findall(r&#39;src&#61;"(.*?)"&#39;, str(psoup))[0] #利用正则表达式获取详情图片链接&#xff0c;因为这里返回的是列表形式&#xff0c;所以取第一个元素&#xff08;只有一个元素&#xff0c;就不用遍历的方式了&#xff09;pic &#61; requests.get(picUrl).content #打开图片链接&#xff0c;并以二进制形式返回&#xff08;图片&#xff0c;声音&#xff0c;视频等要以二进制形式打开&#xff09;image_name &#61;&#39;美女&#39; &#43; &#39;第{}页&#39;.format(page) &#43; str(p&#43;1) &#43; &#39;.jpg&#39; #给图片预定名字image_path &#61; path &#43; &#39;/&#39; &#43; image_name #定义图片保存的地址with open(image_path, &#39;wb&#39;) as f: #保存图片f.write(pic)print(image_name, &#39;下载完毕&#xff01;&#xff01;&#xff01;&#39;)def main():n &#61; input(&#39;请输入要爬取的页数&#xff1a;&#39;)url &#61; &#39;http://www.netbian.com/meinv/&#39; # 资源的首页&#xff0c;可根据自己的需求查看不同分类&#xff0c;自定义改变目录&#xff0c;爬取相应资源if not os.path.exists(&#39;./美女&#39;): # 如果不存在&#xff0c;创建文件目录os.mkdir(&#39;./美女/&#39;)page &#61; 1fillPic(url, page) # 爬取第一页&#xff0c;因为第1页和后续页的链接的区别&#xff0c;单独处理第一页的爬取if int(n) >&#61; 2: #爬取第2页之后的资源ls &#61; list(range(2, 1 &#43; int(n)))url &#61; &#39;http://www.netbian.com/meinv/&#39;for i in ls: #用遍历的方法对输入的需求爬取的页面做分别爬取处理page &#61; str(i)url_page &#61; &#39;http://www.netbian.com/meinv/&#39;url_page &#43;&#61; &#39;index_&#39; &#43; page &#43; &#39;.htm&#39; #获取第2页后的每页的详情链接fillPic(url_page, page) #调用fillPic()函数main()
最后
只看书不会进步&#xff0c;思考和实践才有成长&#xff0c;自学编程是一个比较枯燥的过程&#xff0c;如果没有正向反馈&#xff0c;学习的积极性很容易被打压下来&#xff0c;所以你应该积极参与到相关的技术圈子中去&#xff0c;尝试去解答力所能及的新手问题&#xff0c;向圈子中的大牛们寻求帮助&#xff0c;善于总结自己所学到的东西&#xff0c;分享给更多的人&#xff0c;记住&#xff0c;你不是一个人在战斗。
如果对Python感兴趣的话&#xff0c;可以试试我的学习方法以及相关的学习资料
对于0基础小白入门&#xff1a;
如果你是零基础小白&#xff0c;想快速入门Python是可以考虑培训的。
一方面是学习时间相对较短&#xff0c;学习内容更全面更集中。
Python所有方向的学习路线
Python所有方向的技术点做的整理&#xff0c;形成各个领域的知识点汇总&#xff0c;它的用处就在于&#xff0c;你可以按照上面的知识点去找对应的学习资源&#xff0c;保证自己学得较为全面。
温馨提示&#xff1a;篇幅有限&#xff0c;已打包文件夹&#xff0c;获取方式在“文末”&#xff01;&#xff01;&#xff01;
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频&#xff0c;看视频学习是最快捷也是最有效果的方式&#xff0c;跟着视频中老师的思路&#xff0c;从基础到深入&#xff0c;还是很容易入门的。
四、实战案例
光学理论是没用的&#xff0c;要学会跟着一起敲&#xff0c;要动手实操&#xff0c;才能将自己的所学运用到实际当中去&#xff0c;这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作&#xff0c;下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料&#xff0c;并且有阿里大佬给出了权威的解答&#xff0c;刷完这一套面试资料相信大家都能找到满意的工作。
这份完整版的Python全套学习资料已经上传CSDN&#xff0c;朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】