scrapy爬虫框架调用百度地图api数据存入数据库
scrapy安装配置不在本文 提及,
1.在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令
scrapy startproject mySpider
- 其中, mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹,目录结构大致如下:
下面来简单介绍一下各个主要文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
mySpider/spiders/__init__.py :爬虫主要处理逻辑
2. 今天通过爬虫调用 百度地图api来获取 全国学校的经纬度信息 并入库。
百度地图接口api :http://api.map.baidu.com/place/v2/search?query=小学、中学或者大学®ion=地市名字&output=json&ak=你的开发者ak&page_num=页码
1)打开mySpider目录下的items.py
Item 定义结构化数据字段,用来保存爬取到的数据,也是爬取数据后导出的字段,有点像Python中的dict字典,但是提供了一些额外的保护减少错误。
可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item。
items.py
1 import scrapy
2
3
4 class GetpointItem(scrapy.Item):
5 # define the fields for your item here like:
6 # name = scrapy.Field()
7 name = scrapy.Field() #学校名称
8 lat = scrapy.Field() #纬度
9 lng = scrapy.Field() #经度11 city = scrapy.Field() #地市
12 area = scrapy.Field() #区县
13 address = scrapy.Field() #地址
14 types = scrapy.Field() #学校类型(小学,中学,大学)
2) 打开 mySpider/spiders目录里的 __init__.py写逻辑 ,直接上代码,有注释
1 import scrapy
2 import json
3 from urllib.parse import urlencode
4 from .. import items
5 class DmozSpider(scrapy.Spider):
6 name = "map"
7 allowed_domains = []
8 #三层循环数组分别请求api,由于百度api返回的数据不是所有,所以必须传入页码,来爬取更多数据。
10 def start_requests(self):
11 cities = ['北京','上海','深圳']14 types =['小学','中学','大学']
15 for city in cities:
16 for page in range(1, 16):
17 for type_one in types:
18 base_url = 'http://api.map.baidu.com/place/v2/search?'
19 params = {
20 'query': type_one,
21 'region': city,
22 'output':'json',
23 'ak': '你的ak',
25 'page_num': page
26 }
27 url = base_url + urlencode(params)
28 yield scrapy.Request(url, callback=self.parse,meta={"types":type_one})
29
30 def parse(self, response):
31 res = json.loads(response.text) #请求回来数据需转成json
32 result= res.get('results')
33 types = response.meta["types"] #由于api返回来数据没有学校type的数据,这里需要自己接一下 传参时的type参数
34 #print(types)
35 if result:
36 for result_one in result:
37 item = items.GetpointItem() #调用item的GetpointItem类,导出item
38 item['name'] = result_one.get('name')
39 item['lat'] = result_one.get('location').get('lat')
40 item['lng'] = result_one.get('location').get('lng')42 item['city'] = result_one.get('city')
43 item['area'] = result_one.get('area')
44 item['types'] = types
45 item['address'] = result_one.get('address')
46 yield item
47 else:
48 print('网络请求错误')
3)item导出来了,数据获取到了,然后 入库,打开pipelines.py ,代码如下:
from itemadapter import ItemAdapter
import pymysql
import json class DBPipeline(object):
def __init__(self):
# 连接MySQL数据库
self.connect=pymysql.connect(host='localhost',user='root',password='1q2w3e',db='mapspider',port=3306)
self.cursor=self.connect.cursor()
def process_item(self, item, spider):
# 往数据库里面写入数据
try:
self.cursor.execute("""select * from school where name = %s""", item['name'])
ret = self.cursor.fetchone()
if ret:
print(item['name']+'***********数据重复!***************')
else:
self.cursor.execute(
"""insert into school(name, lng, lat, type,city,county,address)
value (%s, %s, %s, %s, %s, %s, %s)""",
(
item['name'],
json.dumps(item['lng']),
json.dumps(item['lat']),
item['types'],
item['city'],
item['area'],
item['address']
))
self.connect.commit()
return item
except Exception as eror:
print('错误')
# 关闭数据库
def close_spider(self,spider):
self.cursor.close()
self.connect.close()
重复数据的话,fecthOne直接排除 ,入库。。。。,
4)执行脚本 scray crawl map
scrapy crawl map
name 要写对哦
回车 ,开始 唰唰唰
成果如下:
期间 ,百度地图 api 多次并发,不让访问了,多爬几次就好了,程序逻辑 晓得就好了。
接口api爬完了,下次爬一爬 页面xpath上的内容。
scrapy爬虫框架调用百度地图api数据存入数据库的更多相关文章
- Python调用百度地图API实现批量经纬度转换为实际省市地点(api调用,json解析,excel读取与写入)
1.获取秘钥 调用百度地图API实现得申请百度账号或者登陆百度账号,然后申请自己的ak秘钥.链接如下:http://lbsyun.baidu.com/apiconsole/key?applicatio ...
- 调用百度地图Api实现的查看地图功能的小插件
1. 功能 bMap.js 可根据地理位置调用出百度地图,采用弹出框形式 2.用法 var city = '青岛市'; var address = '香港中路'; bMap.init({ city : ...
- 【c#】Form调用百度地图api攻略及常见问题
首先,在Form中调用百度地图api,我们需要使用webbrowser控件,这个在前面的文章中已经讲过了,可以参照(http://blog.csdn.net/buptgshengod/article/ ...
- HTML5调用百度地图API获取当前位置并直接导航目的地的方法
<!DOCTYPE html> <html lang="zh-cmn-Hans"> <meta charset="UTF-8&quo ...
- HTML5 调用百度地图API地理定位
<!DOCTYPE html> <html> <title>HTML5 HTML5 调用百度地图API地理定位实例</title> <head&g ...
- 跨平台移动开发_PhoneGap 使用Geolocation基于所在地理位置坐标调用百度地图API
使用Geolocation基于所在地理位置坐标调用百度地图API 效果图 示例代码 <!DOCTYPE html> <html> <head> <title& ...
- HTML5调用百度地图API进行地理定位实例
自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图AP ...
- HTML5页面直接调用百度地图API,获取当前位置,直接导航目的地
<!DOCTYPE html> <html lang="zh-cmn-Hans"> <meta charset="UTF-8"&g ...
- 调用百度地图API的总结
因为项目要用到百度地图,所以先摸索了一下,各种功能官方都有文档,点击可查看,文章的话我就直接写我用到的功能例子了,要用可以直接复制粘贴~ 一.主要涉及到的几个接口(先申请密钥): 1.技术一:坐标转换 ...
随机推荐
- Windows 环境下搭建 RocketMQ
Apache 官网: http://rocketmq.apache.org/ RocketMQ 的 Github 地址: English:https://github.com/apache/rocke ...
- CCF(引水入城:60分):最大流+ISAP算法
引水入城 201703-5 这从题目分析来看很像最大流的问题,只需要增加一个超级源点和一个超级汇点就可以按照题意连边再跑最大流算法. 因为数据量太大了,肯定会超时.但是没有想到可行的解决方法. #in ...
- 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树
洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...
- Java的封装继承和多态
封装 定义:属性私有private:get/set 目的 提高程序的安全性,保护数据 隐藏代码的实现细节 统一接口 提高系统的可维护性 代码 public class Student { //名字 p ...
- 漏洞复现-CVE-2017-4971-Spring Web Flow 远程代码执行
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场)(兼顾反弹shell的攻击机) 0x01 影响版本 Spring ...
- 死磕Spring之IoC篇 - @Bean 等注解的实现原理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Python爬虫学习一------HTTP的基本原理
昨天刚买的崔大大的<Python3网络爬虫开发实战>,今天就到了,开心的读完了爬虫基础这一章,现记录下自己的浅薄理解,如有见解不到位之处,望指出. 1.HTTP的基本原理 ①我们经常会在浏 ...
- 为什么要从 Linux 迁移到 BSD 4
为什么要从 Linux 迁移到 BSD 4 许可证问题 Linux GPL 许可证对开发者的要求比较严格,它是一种开源的反模式,因为它强制发布所有修改过的源代码,并且阻止其他开源项目的集成,例如 GP ...
- FreeBSD 入门 哲学与玄学
『哲学与玄学』 FreeBSD 是一种 UNIX 哲学(如模块化,一切皆文件等,见< UNIX 编程艺术>❩的发展,也是学院派的代表作品.她是一套工具集,她存在目的是为了让人们更好的生活. ...
- 如何使用Typora写博客
如何写博客及Typora的使用 Typora Typora是写好博客的一个重要的软件,下面我们来介绍如何安装以及使用它 安装 官网下载Typora 较慢,首先附上Typora安装包: 链接:https ...