数据分析基础篇16讲之10Python爬虫:如何自动化下载王祖贤海报?

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

爬虫的流程包括哪几个阶段?
  • 爬虫实际上是用浏览器访问的方式模拟了我们访问网站的过程。
  • 爬虫整个过程分为三个阶段,并在Python中有对应的工具可以使用:
    • 1.打开网页
      • 可以使用Python中Requests访问页面,得到服务器返回给我们的数据,这里包括HTML页面和JSON数据。
    • 2.提取数据
      • 在该过程中主要使用两个工具。针对HTML页面,可以使用XPath进行元素定位,提取数据;针对JSON数据,可以使用JSON进行解析数据。
    • 3.保存数据
      • 可以使用Pandas保存数据,最后并导出到CSV文件即可。
Requests访问页面解释:
  • Requests是Python HTTP的客户端库。

  • 它有两种访问方式:Get和Post。

    • Get是把参数包含在url中

      • r = requests.get('http://www.douban.com')
        
        
      • 代码中r就是Get请求后的访问结果我们可使用r.text或r.content来获取HTML正文。

    • Post则是通过request body来传递参数

      • r = requests.post('http://xxx.com', data = {'key':'value'})
        
        
      • 这里data就是传递的表单参数,data数据类型是字典结构,采用key和value方式进行存储。

XPath定位的解释
  • XPath是XML的路径语言,实际是通过元素和属性进行导航,帮我们确定位置。有几种常用路径表达方式:

    • 表达式含义
      node选node节点的所有子节点
      /从根节点选取
      //选取所有的当前节点,不考虑他们的位置
      .当前节点
      父节点
      @属性选择
      |或,两个节点的合计
      text()当前路径下的文本内容
    • 举例:

      • 1.xpath( ‘node’ ) 选取了node节点的所有子节点
      • 2.xpath( ’ /div ’ ) 从根节点上选取div节点
      • 3.xpath( ’ //div ’ ) 选取所有的div节点
      • 4.xpath( ’ ./div ’ ) 选取当前节点下的div节点
      • 5.xpath( ’ … ’ ) 回到上一个节点
      • 6.xpath( ’ //@id ’ ) 选取所有的id属性
      • 7.xpath( ’ //book[@id] ’ ) 选取所有拥有名为id的属性的book元素
      • 8.xpath( ’ //book[@id=“abc”] ') 选取所有book元素,且这些元素拥有id=“abc”的属性
      • 9.xpath(’ //book/title | //book/price ')选取book元素的所有title和price元素
  • 使用XPath定位,会用到Python的一个解析库lxml。该库使用简单,只需要调用HTML解析命令即可,然后再对HTML进行XPath函数的调用。

  • 如我们想要定位到HTML中所有列表项目,可采用以下代码:

    • from lxml import etree
      html = etree.HTML(html)
      result = html.xpath('//li')
      
      
JSON对象的解释
  • JSON十一种轻量级交互方式,Python中有JSON库,可以将Python和JSON对象相互转换,方便我们对数据进行解析

    • 方法含义
      json.dumps()将Python对象转换成JSON对象
      json.loads()将JSON对象转换为Python对象
    • 将JSON对象转换为Python对象代码如下:

      • import json
        jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
        input = json.loads(jsonData)
        print input
        
        
如何使用JSON数据自动下载王祖贤海报呢?
  • 从豆瓣图片中下载,我们的日常操作步骤为:

    • 1.打开网页
    • 2.输入关键词“王祖贤”
    • 3.在搜索结果页选择图片
    • 4.下载图片页中的所有海报
  • 注意点:若爬取的页面是动态页面,需要关注XHR数据。因为动态页面的原理就是通过原生XHR数据对象发出HTTP请求,得到服务器返回数据后,再进行处理。XHR会用于在后台与服务器进行交换数据

  • 因为图片有多张,故可采用for循环来跑请求,代码如下:

    • # coding:utf-8
      import requests
      import json
      query = '王祖贤'
      ''' 下载图片 '''
      def download(src, id):
      	dir = './' + str(id) + '.jpg'
      	try:
      		pic = requests.get(src, timeout=10)
      		fp = open(dir, 'wb')
      		fp.write(pic.content)
      		fp.close()
      	except requests.exceptions.ConnectionError:
      		print('图片无法下载')
                  
      ''' 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    # 得到返回结果
      	response = json.loads(html,encoding='utf-8') # 将 JSON 格式转换成 Python 对象
      	for image in response['images']:
      		print(image['src']) # 查看当前下载的图片网址
      		download(image['src'], image['id']) # 下载一张图片
      
      
如何使用XPath自动下载王祖贤的电影海报封面呢?
  • 需要使用Python的JSON库

  • 需要安装XPath Helper插件,如果可以打开Google商店,则可直接搜索,如果不可以,可以CSDN上搜索解决方案

  • 可以通过Ctrl+Shift+X,用鼠标选中你想要定位的元素,在界面上会出现一个文件框,分别是Query和Results,Query就是让你来输入XPath语法,Results则看到与之对应的元素结果

  • 我们尝试去除一些XPath表达式,还能保持完整Results中的内容

    • 得到的最终电影海报XPath(假设为变量src_xpath):

      • //div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src
        
        
    • 得到的最终电影名称的XPath(假设为变量title_xpath):

      • //div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']
        
        
  • 但有时我们直接使用Requests获取HTML时,发现想要的XPath不存在,这是因为HTML还没有加载完,我们可以借用一个工具来进行网页加载的模拟,直到完成加载后再给你完整的HTML,这个工具就是Selenium库,使用方法如下:

    • from selenium import webdriver
      driver = webdriver.Chrome()
      driver.get(request_url)
      
      
  • Selenium是Web应用的测试工具,可以直接运用在浏览器中,它的原理是模拟用户进行操作,支持多种主流的浏览器。

  • 这里我们模拟Chrome浏览器的页面访问。

    • 需要先引用Selenium中的WebDriver库。WebDriver实际上就是Selenium 2,是一种用于Web应用程序中自动测试工具,提供了一套有好的API。

    • 然后通过WebDriver创建一个Chrome浏览器的drive,在通过drive获取访问页面的完整HTML

    • 当你获取到完整HTML时,就可以对页面的XPath进行提取,在这里我们需要图片地址srcs和电影名称titles。因为含有多个元素,所以我们需要用for循环对每个元素进行提取。

      • srcs = html.xpath(src_xpath)
        titles = html.xpath(title_path)
        for src, title in zip(srcs, titles):
        	download(src, title.text)
        
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值