目录

5.1解析JSON数据

5.1.1JSON解析库

5.2API的使用

5.2.1 API概述

5.2.2 API验证

5.2.3 API使用前的准备

5.2.4 如何学习使用API

5.3综合案例--爬取糗事百科用户地址信息

5.3.1 爬虫思路分析

5.3.2爬虫代码分析

下面是代码测试

整式封装代码:


当决定去完成一个爬虫操作时,读者的第一反映可能就是用request库请求网页,然后从正则表达式、BeautifulSoup或Lxml中选择一个自己最熟悉的库来解析数据,进而提取数据。但有时我们并不需要那么“卖命”地写代码,因为应用变成接口(Application Programming Interface,API)可能已经为我们做好了一切。本章将对API进行概述,讲解API的使用和调用方法,并对API返回的JSON数据进行解析,左后通过API来完成一些案例。

5.1解析JSON数据

调用API ,服务器会返回JSON格式的数据,如何从中提取有用的信息,是这小节的内容

5.1.1JSON解析库

Python语言中有解析JSON数据的标准库,可以通过下面代码来使用:

import json

不同于其他Python的解析库,JSON解析库并不是把JSON数据解析为JSON对象或JSON节点,而是把JSON数据转换为字典,JSON数组转换成列表,JSON字符串转换为Python字符串,这样便可以轻松的对JSO数据进行操作。

示例

jsonstring = '{"user_man":[{"name":"Peter"},{"name":"xiaoming"}],"user_woman":[{"name":"Anni"},{"name":"zhangsan"}]}'import json
json_data = json.loads(jsonstring)
print(json_data.get("user_man"))
print(json_data.get("user_woman"))
print(json_data.get("user_man")[0].get("name"))
print(json_data.get("user_woman")[1].get("name"))print(json_data["user_man"])
print(json_data["user_woman"])
print(json_data["user_man"][0]["name"])
print(json_data["user_woman"][1]["name"])

自己选择一个JSON数据解析的方法。

5.2API的使用

也许到现在我们还不知道API到底是一个多好用的东西。通过下面的讲解,我们在进行网络爬虫之前应该先考虑该网站是否有API,如果网站有API的话,不用爬虫也可以调用信息。

5.2.1 API概述

随着网络技术的发展,API的应用也越来越多,一些大型网站都会为自己构造API,为使用者或开发者提供便利。例如,可以通过高德地图API,进行查询路线、定位坐标等。服务各种各样,大家自行了解。

API也是通过Requests请求和服务器端的Response回应来完成一次API的调用,与我们前面的request没什么区别,API的请求使用非常严谨的语法,并且API发挥的是JSON或XML数据,而不是HTML数据

5.2.2 API验证

有些简单的API不需要验证操作,但现在大部分API是需要用户提交验证的。提交验证主要是为了计算API调用的费用,对于这种常见的API,如天气查询API,需要购买APIKEY作为验证才能调用API。

5.2.3 API使用前的准备

API的使用也很简单,就是发起GET请求,他会返回JSON或XML数据,我们利用相应的解析库进行解析便可。

(1)首先我们要去高德地图注册一个账号

(2)然后进入个人中心

(3)点击应用管理--》我的管理

(4)点击添加,自己需要什么服务就用什么服务平台,我们这里选择Web服务

输入名称、同意协议点击提交就可以了。下面是我的API,这样前期准备就做好了。

5.2.4 如何学习使用API

授之以鱼不如授之以渔,我们应该学会如何去用一个API,每个API都是由文档指导的。下面以高德地图API为例子。

地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API

这里面我们能够清楚的看到,API服务地址和参数说明以及返回的参数是什么,当出现错误的时候返回的状态码和状态码对应的意义。

这个网址中明确的写明了各种指导,那么其他的API也是大同小异的。

5.3综合案例--爬取糗事百科用户地址信息

本小节,将利用谷歌API,对糗事百科网的用户地址进行经纬度的转换

5.3.1 爬虫思路分析

(1)本节爬取的内容为糗事百科中“热门”板块的用户地址信息,如图

幽默笑话大全_爆笑笑话_笑破你的肚子的搞笑段子 - 糗事百科糗事百科官网提供幽默笑话大全,糗百网分享的各种爆笑笑话、搞笑段子,小心笑破你的肚子,精彩搞笑笑话就在糗事百科!https://www.qiushibaike.com/text/page/1/        (2)本次爬虫我们需要在详细页中(点击用户,进入用户界面)因此我们需要先爬取进入详细页的href,进而爬取数据

(3)运用python语言把数据存入csv文本中。

5.3.2爬虫代码分析

下面是代码测试

from bs4 import BeautifulSoup
import requests
import json
import csv
from lxml import etree   #导入库url = 'https://www.qiushibaike.com/text/page/1/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}href_list = []                               #href初始化列表,后面用于存放href
url_part_1 = 'http://www.qiushibaike.com'
res = requests.get(url,headers=headers)
selector = etree.HTML(res.text)
href_infos = selector.xpath('//div[@class="article block untagged mb15 typs_hot"]')
for href_info in href_infos:hrefs = url_part_1 + href_info.xpath('div[1]/a[2]/@href')[0]   #我们的href是两部分href_list.append(hrefs)for href in href_list:                        re = requests.get(href)selector2 = etree.HTML(re.text)if selector2.xpath('//div[@class="user-statis user-block"]/ul/li[5]/text()'):       #判断个人中心是否由详情界面addresses = selector2.xpath('//div[@class="user-statis user-block"]/ul/li[5]/text()')[-1]# print(addresses)address = addresses.split(' · ')[0]# print(address)if address == '国外':passelse:address = address# print(address)par = {'key':'8d3cb70ffdb3b65c48155903ccdb8338','address':address,}api = 'https://restapi.amap.com/v3/geocode/geo?'r = requests.get(api,par)json_data = json.loads(r.text)try:geo = json_data['geocodes'][0]['location']longitude = geo.split(',')[0]latitude = geo.split(',')[1]print(address,longitude,latitude)except IndexError:passelse:pass

整式封装代码:

from bs4 import BeautifulSoup
import requests
import json
import csv
from lxml import etreefp = open('map2.csv','wt',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('address','longitude','latitude'))
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}def get_user_url(url):    #获取href函数url_part_1 = 'http://www.qiushibaike.com'res = requests.get(url,headers=headers)selector = etree.HTML(res.text)url_infos = selector.xpath('//div[@class="article block untagged mb15 typs_hot"]')for url_info in url_infos:hrefs = url_part_1 + href_info.xpath('div[1]/a[2]/@href')[0]href_list.append(hrefs)for href in href_list:get_user_address(href)def get_user_address(url):   #获取详情地址函数res = requests.get(url, headers=headers)selector = etree.HTML(res.text)if selector2.xpath('//div[@class="user-statis user-block"]/ul/li[5]/text()'):addresses = selector2.xpath('//div[@class="user-statis user-block"]/ul/li[5]/text()')[-1]address = addresses.split(' · ')[0]if address == '国外':passelse:address = adressget_geo(address)else:passdef get_geo(address):   #获取经纬度函数par = {'key':'8d3cb70ffdb3b65c48155903ccdb8338','address':address,}api = 'https://restapi.amap.com/v3/geocode/geo?'res = requests.get(api, par)json_data = json.loads(res.text)try:geo = json_data['geocodes'][0]['location']longitude = geo.split(',')[0]latitude = geo.split(',')[1]writer.writerow((address,longitude,latitude))except IndexError:passif __name__ == '__main__':urls = ['http://www.qiushibaike.com/text/page/{}/'.format(str(i)) for i in range(1, 2)]for url in urls:get_user_url(url)fp.close()

这里要主要API的使用是有限的。

Python爬虫5-API和爬虫相关推荐

  1. 关于网易云音乐爬虫的api接口?

    抓包能力有限,分析了一下网易云音乐的一些api接口,但是关于它很多post请求都是加了密,没有弄太明白.之前在知乎看到过一个豆瓣工程师写的教程,但是被投诉删掉了,请问有网友fork了的吗?因为我觉得他 ...

  2. python爬虫面试问题_Python爬虫面试总结

    ## Python爬虫面试总结 1. 写一个邮箱地址的正则表达式? [A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 2. 谈 ...

  3. python爬虫的用途_python爬虫用途

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 专业点来说就是应用多台机器同时实现爬虫任务,这多台机器上的爬虫,就是称作分布式爬 ...

  4. 百万年薪大佬熬夜写作,Python高级编程之反爬虫及应对方案

    写在前面 爬虫是 Python 的一个常见应用场景,很多练习项目就是让大家去爬某某网站 爬取网页的时候,你大概率会碰到一些反爬措施 这种情况下,你该如何应对呢? 本文梳理了常见的反爬措施和应对方案 接 ...

  5. python俗称_python为什么叫爬虫?

    01 爬虫通常指的是网络爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.因为python的脚本特性,python易于配置,对字符的处理也非常灵活,加上python有丰富的网络抓取模块 ...

  6. python实习目的_python爬虫系列---为什么要学习爬虫

    (0)为什么要学习爬虫 最近刷抖音看到一个话题是"为什么要找程序员老公?",其中一条理由是:写个python网络投票爬虫,稳稳让自家孩子成为幼儿园最美宝宝.当然这算是爬虫的其中一个 ...

  7. python爬虫-世界今日疫情爬虫

    python爬虫-世界今日疫情爬虫 上一篇我的博客中写到对我国疫情的情况爬虫 ,链接为下 中国疫情爬虫. 这篇博客将对世界今日的确诊人数进行爬虫,并将数据保存在excel中.对世界的爬虫方法比爬取中国 ...

  8. python新闻聚合_基于Python的新闻聚合系统网络爬虫研究

    基于 Python 的新闻聚合系统网络爬虫研究 左卫刚 [摘 要] 摘 要 本研究旨在创建一个能够从不同页面布局中提取数据的开源爬 虫,其中包括网络爬虫. API .网络爬虫调度器以及 Socket ...

  9. 基于Spyder(Python 3.8)网络爬虫东方财经股票数据

    基于Python爬取豆瓣电影排行榜单的博主经验,本文将爬取东方股票的某些数据. 代码来自网络且基于此稍有改编. 一.Anaconda是什么? 简单来说,Anaconda是Python的包管理器和环境管 ...

  10. python爬虫动态数据获取_爬虫系列(9)爬虫的多线程理论以及动态数据的获取方法。...

    NO·1 爬虫之多线程 1. 引入我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 不建议你用这个,不过还是介绍下了,如 ...

最新文章

  1. 如何检查文件是否是python中的目录或常规文件? [重复]
  2. 一文了解2020年中国液冷数据中心行业市场现状与发展前景分析市场规模有望破千亿...
  3. 题目3:文本文件单词的检索与计数(实现代码)
  4. 不要在覆写的方法中用super
  5. 15.5.2 【Task实现细节】骨架方法的结构
  6. Spring注解方式实现定时器
  7. Disruptor并发框架--学习笔记
  8. 用Maven管理JavaScript资源
  9. c/c++编码规范(2)--作用域
  10. 试析C#编程语言的特点及功能
  11. radiobutton 设置为不能点击_谷歌要求:安卓 11 相机默认不能设置为“美颜”模式...
  12. ホワイトボックステストとブラックボックステストの区別(白盒测试与黑盒测试的区别)...
  13. 惠普企业级服务器型号,惠普企业级服务器HP rx8640
  14. java语法有哪些_java编程基础语法都有哪些
  15. 流传甚少的seo排名爆破技术全解析
  16. empty怎么发音_empty是什么意思_empty的翻译_音标_读音_用法_例句_爱词霸在线词典...
  17. diffuse、specular贴图的光照
  18. 电脑的锁屏密码忘记了怎么办?
  19. 傻孩子菜单框架(转)
  20. 安安猜价格聪明机器人_2021年智慧树APP不动产估价第八单元章节测试答案

热门文章

  1. 如何成为一名卓越的程序员
  2. 踩坑合集(1)——虚拟机桥接模式下的连网问题
  3. SENTAURUS_2018_06
  4. FlashFXP 连接centos
  5. switch 无法启动软件,请在HOME菜单中再试一次
  6. 李开复给中国学生的四封信(转载)
  7. Wind的实时行情API使用
  8. antdesign图片点击放大_vue图片点击放大功能
  9. Vue引入Froala-Editor富文本编辑器
  10. WPS中word转pdf文件时给pdf文件增加目录