数据分析实战 45 讲
陈旸
清华大学计算机博士
123928 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

10丨Python爬虫:如何自动化下载王祖贤海报?

使用Selenium库来获取完整的HTML
使用lxml库,进行XPath的提取
XPath定位,JSON对象解析
Python爬虫的流程
下载图片
使用Selenium库模拟浏览器获取完整的HTML
使用XPath定位图片的网址和电影名称
下载图片
JSON对象解析
XHR数据
转换成Python对象
使用lxml库进行XPath定位
常用路径表达方式
Post方式
Get方式
保存数据
提取数据
打开网页
总结
如何使用XPath自动下载王祖贤的电影海报封面
如何使用JSON数据自动下载王祖贤的海报
JSON对象
XPath定位
Requests访问页面
爬虫的流程
Python爬虫

该思维导图由 AI 生成,仅供参考

上一讲中我给你讲了如何使用八爪鱼采集数据,对于数据采集刚刚入门的人来说,像八爪鱼这种可视化的采集是一种非常好的方式。它最大的优点就是上手速度快,当然也存在一些问题,比如运行速度慢、可控性差等。
相比之下,爬虫可以很好地避免这些问题,今天我来分享下如何通过编写爬虫抓取数据。

爬虫的流程

相信你对“爬虫”这个词已经非常熟悉了,爬虫实际上是用浏览器访问的方式模拟了访问网站的过程,整个过程包括三个阶段:打开网页、提取数据和保存数据。
在 Python 中,这三个阶段都有对应的工具可以使用。
在“打开网页”这一步骤中,可以使用 Requests 访问页面,得到服务器返回给我们的数据,这里包括 HTML 页面以及 JSON 数据。
在“提取数据”这一步骤中,主要用到了两个工具。针对 HTML 页面,可以使用 XPath 进行元素定位,提取数据;针对 JSON 数据,可以使用 JSON 进行解析。
在最后一步“保存数据”中,我们可以使用 Pandas 保存数据,最后导出 CSV 文件。
下面我来分别介绍下这些工具的使用。
Requests 访问页面
Requests 是 Python HTTP 的客户端库,编写爬虫的时候都会用到,编写起来也很简单。它有两种访问方式:Get 和 Post。这两者最直观的区别就是:Get 把参数包含在 url 中,而 Post 通过 request body 来传递参数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用Python爬虫自动下载王祖贤的海报。首先讲解了爬虫的基本流程,包括打开网页、提取数据和保存数据。然后详细介绍了在Python中使用Requests访问页面、使用XPath定位和使用JSON解析数据的方法。接着,从两个角度讲解了如何使用Python爬取王祖贤的海报,分别是通过JSON数据爬取和通过XPath定位爬取。通过模拟豆瓣图片搜索的实例,演示了如何通过XHR数据获取图片信息,并使用for循环下载所有海报。文章内容涵盖了爬虫的基本原理和实现工具,以及实际操作的具体步骤和代码示例。此外,还介绍了如何使用Selenium库模拟浏览器,获取完整的HTML,以及对HTML中的XPath进行提取。总结了Python爬虫的流程、XPath定位、JSON对象解析、lxml库的使用以及Selenium库的应用。文章内容丰富,适合想要学习Python爬虫并进行实际应用的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(101)

  • 最新
  • 精选
  • 说明两点问题: (一).留言里有人评论说用XPath下载的图片打不开,其原因是定义的下载函数保存路径后缀名为'.jpg',但是用XPath下载获得的图片url为'https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p616.webp',本身图片为webp格式,所以若保存为jpg格式,肯定是打不开的。 (二). 老师在文章内讲的用XPath下载代码只能下载第一页的内容,并不是全部的数据,不知道大家有没有查看用xpath函数获得的数组,大家留言里的代码似乎和老师的一样,只能得到首页的内容,所以也是需要模拟翻页操作才能获得完整的数据。 以下是课后练习题:爬取宫崎骏的电影海报, Python3.6 IDLE >>> import json >>> import requests as req >>> from lxml import etree >>> from selenium import webdriver >>> import os >>> request_url = 'https://movie.douban.com/subject_search?search_text=宫崎骏&cat=1002' >>> src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src" >>> title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']" >>> driver = webdriver.Chrome('/Users/apple/Downloads/chromedriver') >>> driver.get(request_url) >>> html = etree.HTML(driver.page_source) >>> srcs = html.xpath(src_xpath) >>> print (srcs) #大家可要看下打印出来的数据是否只是一页的内容,以及图片url的后缀格式 >>> picpath = '/Users/apple/Downloads/宫崎骏电影海报' >>> if not os.path.isdir(picpath): os.mkdir(picpath) >>> def download(src, id): dic = picpath + '/' + str(id) + '.webp' try: pic = req.get(src, timeout = 30) fp = open(dic, 'wb') fp.write(pic.content) fp.close() except req.exceptions.ConnectionError: print ('图片无法下载') >>> for i in range(0, 150, 15): url = request_url + '&start=' + str(i) driver.get(url) html = etree.HTML(driver.page_source) srcs = html.xpath(src_xpath) titles = html.xpath(title_xpath) for src,title in zip(srcs, titles): download(src, title.text)

    作者回复: 滢同学总结整理的很不错,大家都可以看下

    2019-04-10
    2
    63
  • rOMEo罗密欧
    老师请问一下:如果是需要用户登陆后才能爬取的数据该怎么用python来实现呢?

    作者回复: 你可以使用python+selenium的方式完成账户的自动登录,因为selenium是个自动化测试的框架,使用selenium 的webdriver就可以模拟浏览器的行为。找到输入用户名密码的地方,输入相应的值,然后模拟点击即可完成登录(没有验证码的情况下) 另外你也可以使用cookie来登录网站,方法是你登录网站时,先保存网站的cookie,然后用下次访问的时候,加载之前保存的cookie,放到request headers中,这样就不需要再登录网站了

    2019-01-04
    4
    45
  • Bayes
    老师你这跳过了太多步骤了,表示对于python跟着你前几节课入门的人什么都不会,按着你的代码运行,要不就是没有定义,要不就是没有这个函数。刚开始的人也不知道哪个函数在哪个库,建议老师按照流程来一步一步给代码,要不就在最后给一个完整的代码示例,真的是学的很困难加上想放弃

    作者回复: 慢慢来,有些代码放到GitHub上了,可以先跑下

    2019-07-30
    8
    18
  • LY
    #环境:Mac Python3 #pip install selenium #下载chromedriver,放到项目路径下(https://npm.taobao.org/mirrors/chromedriver/2.33/) # coding:utf-8 import requests import json import os from lxml import etree from selenium import webdriver query = '张柏芝' downloadPath = '/Users/yong/Desktop/Python/xpath/images/' ''' 下载图片 ''' def download(src, id): dir = downloadPath + str(id) + '.jpg' try: pic = requests.get(src, timeout=10) except requests.exceptions.ConnectionError: # print 'error, %d 当前图片无法下载', %id print('图片无法下载') if not os.path.exists(downloadPath): os.mkdir(downloadPath) if os.path.exists(dir): print('已存在:'+ id) return fp = open(dir, 'wb') fp.write(pic.content) fp.close() def searchImages(): ''' for 循环 请求全部的 url ''' for i in range(0, 22471, 20): url = 'https://www.douban.com/j/search_photo?q='+query+'&limit=20&start='+str(i) html = requests.get(url).text # 得到返回结果 print('html:'+html) response = json.loads(html,encoding='utf-8') # 将 JSON 格式转换成 Python 对象 for image in response['images']: print(image['src']) # 查看当前下载的图片网址 download(image['src'], image['id']) # 下载一张图片 def getMovieImages(): url = 'https://movie.douban.com/subject_search?search_text='+ query +'&cat=1002' driver = webdriver.Chrome('/Users/yong/Desktop/Python/xpath/libs/chromedriver') driver.get(url) html = etree.HTML(driver.page_source) # 使用xpath helper, ctrl+shit+x 选中元素,如果要匹配全部,则需要修改query 表达式 src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src" title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']" srcs = html.xpath(src_xpath) titles = html.xpath(title_xpath) for src, title in zip(srcs, titles): print('\t'.join([str(src),str(title.text)])) download(src, title.text) driver.close() getMovieImages()

    作者回复: GoodJob

    2019-01-04
    16
  • 伪君子
    那些用 ChromeDriver 的出现报错的可能是没有安装 ChromeDriver,或者是没给出 ChromeDriver 的路径,具体可以看看下面这篇文章。 https://mp.weixin.qq.com/s/UL0bcLr3KOb-qpI9oegaIQ

    作者回复: 对的,主要是配置ChromeDriver的问题。有相同问题的人,可以看下这个留言

    2019-01-04
    2
    16
  • 感谢作者以及评论区的各位大神,终于完成了爬虫代码,总结一下小白编写时遇到的几个问题: 1)获取xpath时,chrome浏览器需要安装插件xpatn-helper; 2)使用python3.7,提前引入模块requests,lxml,selenium,安装这些模块需要更新pip至20版本; 3)模拟用户访问浏览器,需要下载chromedriver.exe,放入python.exe所在目录; 4)图片路径中出现导致编译失败的字符,使用replace替换报错字符。 具体代码如下: import os import requests from lxml import etree from selenium import webdriver search_text = "王祖贤" start = 0 limit = 15 total = 90 def download(img, title): dir = "D:\\数据分析\\python test\\query\\" + search_text + "\\" id = title.replace(u'\u200e', u'').replace(u'?', u'') .replace(u'/', u'or') if not os.path.exists(dir): os.makedirs(dir) try: pic = requests.get(img, timeout=10) img_path = dir + str(id) + '.jpg' fp = open(img_path, 'wb') fp.write(pic.content) fp.close() except requests.exceptions.ConnectionError: print('图片无法下载') def crawler_xpath(): src_img = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src" src_title = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']" for i in range(start,total,limit): request_url = "https://search.douban.com/movie/subject_search?search_text="+search_text+"&cat=1002&start="+str(i) driver = webdriver.Chrome() driver.get(request_url) html = etree.HTML(driver.page_source) imgs = html.xpath(src_img) titles = html.xpath(src_title) print(imgs,titles) for img, title in zip(imgs, titles): download(img, title.text) if __name__ == '__main__': crawler_xpath()

    作者回复: Good Job!

    2020-04-08
    3
    9
  • germany
    老师:为什么我在豆瓣网查询图片的网址与你不一样?https://www.douban.com/search?cat=1025&q=王祖贤&source=suggest 。是什么原因?

    作者回复: 咱们访问豆瓣查询图片的网址应该是一样的。只是我给出的是json的链接。方法是:用Chrome浏览器的开发者工具,可以监测出来网页中是否有json数据的传输,所以我给出的链接是json数据传输的链接 https://www.douban.com/j/search_photo?q=%E7%8E%8B%E7%A5%96%E8%B4%A4&limit=20&start=0

    2019-01-04
    2
    6
  • 許敲敲
    要下载所有James 哈登的图片

    作者回复: NBA明星也是不错的选择

    2019-01-04
    5
  • Geek_2008d9
    为什么我总是response=json.loads那一行显示json.decoder.JSONDecoderError:expecting value:line 1 column 1(char 0) 呢,怎么解决啊,各位大佬

    作者回复: JSON解析错误,可以使用try ... except ... 捕获下错误看看

    2019-12-14
    3
    4
  • Geek_c45626
    老师,运行代码总是出错:JSONDecodeError: Expecting value: line 1 column 1 (char 0),这个怎么解决?

    作者回复: 可以使用 try ... except ... 捕获下错误看看

    2019-12-06
    7
    3
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部