10丨Python爬虫:如何自动化下载王祖贤海报?
该思维导图由 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-10263 - rOMEo罗密欧老师请问一下:如果是需要用户登陆后才能爬取的数据该怎么用python来实现呢?
作者回复: 你可以使用python+selenium的方式完成账户的自动登录,因为selenium是个自动化测试的框架,使用selenium 的webdriver就可以模拟浏览器的行为。找到输入用户名密码的地方,输入相应的值,然后模拟点击即可完成登录(没有验证码的情况下) 另外你也可以使用cookie来登录网站,方法是你登录网站时,先保存网站的cookie,然后用下次访问的时候,加载之前保存的cookie,放到request headers中,这样就不需要再登录网站了
2019-01-04445 - Bayes老师你这跳过了太多步骤了,表示对于python跟着你前几节课入门的人什么都不会,按着你的代码运行,要不就是没有定义,要不就是没有这个函数。刚开始的人也不知道哪个函数在哪个库,建议老师按照流程来一步一步给代码,要不就在最后给一个完整的代码示例,真的是学的很困难加上想放弃
作者回复: 慢慢来,有些代码放到GitHub上了,可以先跑下
2019-07-30818 - 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-0416 - 伪君子那些用 ChromeDriver 的出现报错的可能是没有安装 ChromeDriver,或者是没给出 ChromeDriver 的路径,具体可以看看下面这篇文章。 https://mp.weixin.qq.com/s/UL0bcLr3KOb-qpI9oegaIQ
作者回复: 对的,主要是配置ChromeDriver的问题。有相同问题的人,可以看下这个留言
2019-01-04216 - 飘感谢作者以及评论区的各位大神,终于完成了爬虫代码,总结一下小白编写时遇到的几个问题: 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-0839 - 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-0426 - 許敲敲要下载所有James 哈登的图片
作者回复: NBA明星也是不错的选择
2019-01-045 - Geek_2008d9为什么我总是response=json.loads那一行显示json.decoder.JSONDecoderError:expecting value:line 1 column 1(char 0) 呢,怎么解决啊,各位大佬
作者回复: JSON解析错误,可以使用try ... except ... 捕获下错误看看
2019-12-1434 - Geek_c45626老师,运行代码总是出错:JSONDecodeError: Expecting value: line 1 column 1 (char 0),这个怎么解决?
作者回复: 可以使用 try ... except ... 捕获下错误看看
2019-12-0673