10 Python爬虫:如何自动化下载王祖贤海报?
爬虫的流程包括哪几个阶段?
- 爬虫实际上是用浏览器访问的方式模拟了我们访问网站的过程。
- 爬虫整个过程分为三个阶段,并在Python中有对应的工具可以使用:
- 1.打开网页
- 可以使用Python中Requests访问页面,得到服务器返回给我们的数据,这里包括HTML页面和JSON数据。
- 2.提取数据
- 在该过程中主要使用两个工具。针对HTML页面,可以使用XPath进行元素定位,提取数据;针对JSON数据,可以使用JSON进行解析数据。
- 3.保存数据
- 可以使用Pandas保存数据,最后并导出到CSV文件即可。
- 1.打开网页
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)
-
-