首页 > 其他分享 >使用网络爬虫爬取省市区县的经纬度

使用网络爬虫爬取省市区县的经纬度

时间:2024-05-25 14:44:41浏览次数:22  
标签:codecraft code 爬虫 us 爬取 import 省市区 com webmagic

我们从阿里云的数字可视化平台获取数据 http://datav.aliyun.com/tools/atlas

爬取的链接如下:

湖北省(不包含子区域):https://geo.datav.aliyun.com/areas_v3/bound/420000.json

湖北地级市(包含子区域):https://geo.datav.aliyun.com/areas_v3/bound/420100_full.json(武汉市为例)

湖北区/县:https://geo.datav.aliyun.com/areas_v3/bound/420111.json(武汉市洪山区为例)

我们通过获取所有省市区的地址来爬取不太现实,我们可以先从数据库中获取省市区县的area_code编码,从而可以得到上面省市区的地址。

我们使用webmagic框架来爬取,这里直接上代码:

爬取类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Json;

import java.math.BigDecimal;

//WebMagic的结构分为Downloader(下载)、PageProcessor(解析处理)、Scheduler(管理URL并去重)、Pipeline(持久化)四大组件
public class LngLatProcessor implements PageProcessor {
    public void process(Page page) {
        //打印页面内容
        Json json = page.getJson();
        String s = json.get();
        JSONObject jsonObject = JSON.parseObject(s);
        JSONArray features = jsonObject.getJSONArray("features");
        int size = features.size();
        for (int i = 0; i < size; i++) {
            JSONObject jsonObject1 = features.getJSONObject(i);
            JSONObject properties = jsonObject1.getJSONObject("properties");
            JSONArray center = properties.getJSONArray("center");
            String name = properties.getString("name");
            Integer code = properties.getInteger("adcode");
            BigDecimal longitude = (BigDecimal) center.get(0);
            BigDecimal latitude = (BigDecimal) center.get(1);
            page.putField("name", name);

            page.putField("code", code);
            page.putField("longitude", longitude.doubleValue());
            page.putField("latitude", latitude.doubleValue());
        }
    }
    public Site getSite() {
        return Site.me()
                .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.2.300")
                .setSleepTime(1000)
                .setTimeOut(10000)
                .setRetryTimes(3);
    }
}

定制pipeline输出

import com.ljxx.pts.dao.AreasMapper;
import com.ljxx.pts.entity.Areas;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;

// 定制pipeline输出
@Component
public class MyPipeline implements Pipeline {
    @Resource
    private AreasMapper areasMapper;
    @Override
    public void process(ResultItems resultItems, Task task) {
        Areas areaCode = new Areas();
        areaCode.setUpdateTime(new Date());
        for (Map.Entry<String, Object> entry : resultItems.getAll().entrySet()) {
            if ("code".equalsIgnoreCase(entry.getKey())) {
                Integer code = (Integer) entry.getValue();
                System.out.println(code);
                areaCode.setId(code);
            }
            if ("latitude".equalsIgnoreCase(entry.getKey())) {
                Double latitude = (Double) entry.getValue();
                System.out.println(latitude);
                areaCode.setLatitude(latitude);
            }
            if ("longitude".equalsIgnoreCase(entry.getKey())) {
                Double longitude = (Double) entry.getValue();
                System.out.println(longitude);
                areaCode.setLongitude(longitude);
            }
        }
        // 在pipeline中将数据保存到数据库
        int i = areasMapper.updateByPrimaryKeySelective(areaCode);

    }
}

测试类

import com.ljxx.pts.dao.AreasMapper;
import com.ljxx.pts.entity.Areas;
import com.ljxx.pts.webmagic.LngLatProcessor;
import com.ljxx.pts.webmagic.MyPipeline;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import us.codecraft.webmagic.Spider;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class TestDemo {

//    @Autowired
//    private LngLatProcessor processor;
    @Autowired
    private MyPipeline myPipeline;
    @Resource
    private AreasMapper areasMapper;
    @Test
    public void test(){
        // 先获取省的code,省市区的级别分别为1,2,3
        Areas areas1 = new Areas();
        areas1.setAreaLevel(3);
        List<Areas> areas = areasMapper.select(areas1);
        for (Areas area : areas) {
            Integer id = area.getId();
            Spider.create( new LngLatProcessor())
                    .addUrl("https://geo.datav.aliyun.com/areas_v3/bound/"+id+".json")
                    .addPipeline(myPipeline)
                    .thread(5)
                    .run();
        }

    }

}

 

标签:codecraft,code,爬虫,us,爬取,import,省市区,com,webmagic
From: https://www.cnblogs.com/zwh0910/p/18212400

相关文章

  • 头歌实验平台-Python-Scrapy爬虫之拉勾网招聘数据分析(第4,5关)
    首先十分感谢在博主(Radish_c-CSDN博客)的帮助下,完成了这个实验的1-3关,然后第4-5关就卡住了,然后搜了好久,这个实验4和5平台上只有博主 (Radish_c-CSDN博客)这个需要更改命令行的答案,博主的原文章在这里Python应用-Scrapy爬虫之拉勾网招聘数据分析-CSDN博客Python应用-Scrapy爬虫......
  • Python爬虫基本流程
    Python爬虫是指利用Python编程语言编写的程序,用于从网页上获取数据。通常,爬虫程序会模拟人类用户在网页上的行为,发送HTTP请求获取网页内容,然后解析这些内容以提取所需信息。常用的爬虫库包括requests用于发送HTTP请求,BeautifulSoup用于解析HTML或XML内容,以及Scrapy用于构建更复......
  • Python爬虫--爬取文字加密的番茄小说
    一、学爬虫,看小说很久没有去研究爬虫了,借此去尝试爬取小说查看小说,发现页面返回的内容居然都是加密的。 二、对小说目录进行分析通过分析小说目录页面,获取小说名称等内容引用parsel包,对页面信息进行获取url="https://fanqienovel.com/reader/7276663560427471412?e......
  • 爬虫方式(模拟用户)
    基于rake的爬取代码require'nokogiri'require'json'require'open-uri'namespace:spider_sbi_code_infodotasktable_data::environmentdooptions=Selenium::WebDriver::Chrome::Options.newoptions.add_argument('--he......
  • LLM实战:当网页爬虫集成gpt3.5
    1.背景最近本qiang~关注了一个开源项目Scrapegraph-ai,是关于网页爬虫结合LLM的项目,所以想一探究竟,毕竟当下及未来,LLM终将替代以往的方方面面。这篇文章主要介绍下该项目,并基于此项目实现一个demo页面,页面功能是输入一个待爬取的网页地址以及想要从网页中抽取的内容,最后点击按钮......
  • 【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目
    项目介绍【开源】项目基于python+pandas+flask+mysql等技术实现豆瓣电影数据获取及可视化分析展示,觉得有用的朋友可以来个一键三连,感谢!!!项目演示[video(video-C9B87WwE-1716106102936)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=1204518067)(image-https......
  • python爬虫基础
    前言Python非常适合用来开发网页爬虫,理由如下:1、抓取网页本身的接口相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁;相比其他动态脚本语言,如perl,shell,python的urllib包提供了较为完整的访问网页文档的API。(当然ruby也是很好的选择)此外,抓取网页有时候需要模......
  • 防爬虫方法
    调用方法 //检查请求是否来自爬虫if($this->isCrawler()){$this->ajaxReturn(array('status'=>'0','info'=>'爬虫访问'));}//限制访问次数$result=$this->api_frequency_visits(UID);if(!$result)......
  • 爬虫-JSON文件存储
    JSON文件存储JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集;JSON在Python中分别由list和dict组成;1、JSON模块的功能函数描述json.dumps()将python类型转换为字符串,返回一个str对象。实现把一个python对象编码转换成JSON字符串json.loads()把JSO......
  • 爬虫-CSV文件存储
    CSV文件存储CSV是CommaSeparatedValues,称为逗号分隔值,一种以.csv结尾的文件,所有值都是字符串。文件操作示例importcsvwithopen('student.csv','a+',newline='')asfile:#newline=''表示不空行#创建一个writer对象writer=csv.writer(file)#一次写......