背景

作为一个计算机基础薄弱的电气工程师,廖大的教程看到常用的内建模块时,看的头大,特别是看到HTMLParser时,已宛如天书了。这时作为一个初学者的劣势就暴露出来了,我不知道哪部分知识是理解这些模块的前置条件,即使知道是哪部分知识,但不知道该理解到什么程度才能解决当前的问题。个人建议是,把这个难题就当成一个工具,会使用,能解决当前的问题就好。不必知道其更多的用法,甚至其背后的实现细节,以及其代表的另一个领域的知识。就像学习开车,先学会打火,转方向盘,能让车子动起来就好,不必知道道路规则,更不必知道制造车子的工艺,以及其背后的物理原理。
闲话少说,这时想到,之前看过小甲鱼出的一套0基础的Python视频教程,针对的是初学者。于是,暂时战略性放弃了廖大的教程,转投小甲鱼的怀抱。小甲鱼确实讲的通俗易懂,而且由于是视频,其传递的信息量要比文字教程大多了,细节方面更详细。看到《056 论一只爬虫的自我修养4:OOXX》时,抄写小甲鱼的代码,并不能成功运行。抓取的html源码里并没有图片的地址,我一直以为是我的源码有问题。后来咨询了一个写python的朋友,他给了我一个验证源码是不是有问题的办法,并推测有可能是动态网页的原因。
动态网页???第一次听到这个概念,于是开始查怎么用python抓取动态网页的元素。查到这篇文章爬取煎蛋网的妹子图,源码有些问题,但是其提供的思路是对的,用python+selenium+chromedriver的技术路线抓取网页的html源码,中间又踩了一些坑,但最终还是成功了。

源码与测试

事先要分析url的构成规律,以及图片元素的存储规律,详情参考小甲鱼的视频。

# -*- coding:utf-8 -*-
# 2018/12/10
# author:zxqimport urllib.request
import re,os
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options# 下载煎蛋网page_number页前的所有图片s = r'img src=\"(.+(jpg|gif))' # 正则表达式,匹配html源文件中的jpg,gif等图片的链接,注意:这里将图片的地址列成了一个group
re_html = re.compile(s) # 预编译,提高效率# 利用selenium+chromedriver+beautifulSoup4,解析动态网页的html
def getPage(url):chrome_options = Options()chrome_options.add_argument('--headless') # 浏览器不提供可视化界面chrome_options.add_argument('--disable-gpu') # 需要加上这个属性来规避bugdriver = webdriver.Chrome(chrome_options = chrome_options,executable_path=r'D:\Chromedriver\chromedriver.exe') # D:\Chromedriver\chromedriver.exe是chromedriver的本地安装路径driver.get(url) # 打开网址html = driver.page_sourcehtml_source = BeautifulSoup(html, 'html.parser') # 'html.parser'是python内置标准库,前置条件,了解HTML的语法return html_source# 利用findall函数返回图片链接地址的list
def getList(html_source):pic_list = re_html.findall(str(html_source))return pic_list # 返回list# 根据图片的链接将图片下载到本地
def download_pic(url,format,name):req = urllib.request.Request(url)req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36')response = urllib.request.urlopen(req)mm_img = response.read()with open(name + '.' + format,'wb') as f:f.write(mm_img)def save_imgs(folder, page_number):if(os.path.exists(folder) == False):os.mkdir(folder) # 创建一个名为mm_pic的文件夹os.chdir(folder) # 切换到mm_pic文件夹下urlbase = 'http://jandan.net/ooxx/' # 网站地址for i in range(3,page_number):url = urlbase + 'page-' + str(i) + '#comments'html_source = getPage(url)list = getList(html_source)for j in range(list.__len__()):download_pic(list[j][0],list[j][1],str(i)+'-'+str(j))print('OK')if __name__ == '__main__':save_imgs('mm_pic',55)

最终抓取的图片列表(然鹅并没有什么美女图):

坑与疑点解析

  • 用urllib.request.urlopen()取到的html地址中不包含.jpg的链接
    利用Chrome的开发者工具查看网页的源码,选中图片,可以看到图片的的链接:

    但是利用urllib.request.urlopen()抓取到的html源码中根本不包含.jpg的相关字符串:
    源码如下:
# -*- coding:utf-8 -*-
# 2018/12/10
# author:zxqimport urllib.request
import re,os
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options# 下载煎蛋网page_number页前的所有图片s = r'img src=\"(.+(jpg|gif))' # 正则表达式,匹配html源文件中的jpg,gif等图片的链接,注意:这里将图片的地址列成了一个group
re_html = re.compile(s) # 预编译,提高效率# 利用selenium+chromedriver+beautifulSoup4,解析动态网页的html
def getPage(url):chrome_options = Options()chrome_options.add_argument('--headless') # 浏览器不提供可视化界面chrome_options.add_argument('--disable-gpu') # 需要加上这个属性来规避bugdriver = webdriver.Chrome(chrome_options = chrome_options,executable_path=r'D:\Chromedriver\chromedriver.exe') # D:\Chromedriver\chromedriver.exe是chromedriver的本地安装路径driver.get(url) # 打开网址html = driver.page_sourcehtml_source = BeautifulSoup(html, 'html.parser') # 'html.parser'是python内置标准库,前置条件,了解HTML的语法return html_source# 利用findall函数返回图片链接地址的list
def getList(html_source):pic_list = re_html.findall(str(html_source))return pic_list # 返回list# 根据图片的链接将图片下载到本地
def download_pic(url,format,name):req = urllib.request.Request(url)response = urllib.request.urlopen(req)cat_img = response.read()with open(name + '.' + format,'wb') as f:f.write(cat_img)def save_imgs(folder, page_number):if(os.path.exists(folder) == False):os.mkdir(folder) # 创建一个名为mm_pic的文件夹os.chdir(folder) # 切换到mm_pic文件夹下urlbase = 'http://jandan.net/ooxx/' # 网站地址url = urlbase + 'page-' + str(55) + '#comments'req = urllib.request.Request(url)req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36')source = urllib.request.urlopen(req)url_source = source.read().decode('utf-8')print('Status:', source.status, source.reason)print(url_source)print('OK')if __name__ == '__main__':save_imgs('mm_pic',55)

结果中并没有包含jpg的字符串。

一度以为源码有问题。于是咨询了写Python的朋友,他给了两个判断方法:
1. 查看网页返回的status与reason;
2. 查看调试工具下的response。
status与reason的状态如下:

在response中查看网页的html源码,才发现也不包含jpg字段。

于是猜测有可能是动态网页的原因。

  • chrome_options.add_argument(’–headless’) ,chrome_options.add_argument(’–disable-gpu’) 这两句的含义是什么?
    参考地址:python+selenium+chrome的一些备忘
  • 正则表达式
    在线测试网址:正则表达式在线工具
    廖大的正则表达式讲解
  • bs4使用方法
    bs4官方文档
    几个解析器的对比:

还需要了解的知识

  1. HTML语法
  2. 正则表达式
  3. 其他爬取图片的方式

第一个Python爬虫-抓取煎蛋网上图片相关推荐

  1. 用Python爬虫抓取煎蛋(jandan.net)无聊图和妹子图

    用Python爬虫抓取煎蛋(jandan.net)无聊图和妹子图,有需要的朋友可以参考下. 初学Python, 练手写了个程序 通过Python爬虫抓取煎蛋无聊图和妹子图,存储到本地硬盘 使用了pyq ...

  2. python爬虫——抓取煎蛋网ooxx妹子图的一个小工具

    一点学习成果,仅限学习交流! 一.部分源码: def get_page(html):# 获取下一页链接start1 = str(html).find("Older Comments" ...

  3. Python爬虫抓取煎蛋(jandan.net)无聊图

    1 #!/usr/bin/python 2 #encoding:utf-8 3 ''' 4 @python 3.6.1 5 @author: 1109159477@qq.com 6 @create d ...

  4. python爬虫图片实例-Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  5. Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  6. python 爬虫爬取煎蛋网妹子图,我1T的硬盘装满了!

    前言 大家好,这里是「brucepk」爬虫 系列教程.此系列教程以实例项目为材料进行分析,从项目中学习 python 爬虫,跟着我一起学习,每天进步一点点. 煎蛋网站 image 很多朋友都反应学 p ...

  7. 用python来抓取“煎蛋网”上面的美女图片,尺度很大哦!哈哈

    所用Python环境为:python 3.3.2   用到的库为:urllib.request    re 废话不多说,先上代码: import urllib.request import re#获得 ...

  8. python爬图代码实例_Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  9. 使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图

    第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到"煎蛋网xxoo"网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保 ...

  10. python爬虫招聘-Python爬虫抓取智联招聘(基础版)

    原标题:Python爬虫抓取智联招聘(基础版) 作者:C与Python实战 「若你有原创文章想与大家分享,欢迎投稿.」 对于每个上班族来说,总要经历几次换工作,如何在网上挑到心仪的工作?如何提前为心仪 ...

最新文章

  1. python在工厂中的运用_Python常见工厂函数用法示例
  2. mysql-5.6 升级 5.7
  3. 十字相乘法c语言,十字相乘法的运算方法
  4. NSTableView使用笔记(一)
  5. python摄像头推流_树莓派使用python-librtmp实现rtmp推流h264的方法
  6. 自定义SeekBar 实时显示百分比进度
  7. mc服务器出生地修改,《我的世界》MC出生地太坑爹怎么办?大神教你一个指令就搞定了!...
  8. PHP正则判断手机号码格式/邮箱正则
  9. Codeforces686C【dfs】
  10. python scipy stats_Python Scipy stats.binned_statistic_dd()用法及代码示例
  11. sublime自定义snippet代码片段
  12. DM***+GET***测试
  13. 【备份】golang开发环境搭建
  14. 深入浅出Python——Python高级语法之文件操作
  15. Mat转QImage
  16. Android GifImageView加载Gif图片及原理
  17. YUV格式视频流文件下载
  18. 2021年最新最全APP各大安卓市场应用首发规则
  19. Laya发布魅族小游戏,调试前步骤
  20. 手游开发者大会交流OGEngine新版本发布

热门文章

  1. Day4----类训练(搬家具、烤地瓜)
  2. Python字符串总结大全
  3. 浙江大学 找出直系亲属(java)
  4. API接口怎么使用(教你使用api接口获取数据)
  5. 【光学】基于矩阵法和等效界面法分析光学薄
  6. python运维都做些什么_系统运维是做什么的(python在实际工作中的应用)
  7. 日期计算器输入天数计算日期_计算日期范围内的活动
  8. 闲鱼SPU体系构建的背后
  9. dmac学习之基于LLI的multi block tranfer验证
  10. pyTest官方手册(Release 4.2)之蹩脚翻译(9)