多线程撒网式爬取全国地图各地区矿点信息

今天给大家带来一个全国各地矿区信息爬取的爬虫。

目标地址(推荐使用谷歌浏览器打开):http://ngac.org.cn/Kuangchandi/index.html

打开这个链接后我们会看到如下画面:

真夜猫.JPG

点击右上角的属性查询,再点击地图上这些红红绿绿的点,就会弹出此片矿区相关属性。

网页数据抓取分析:

这个网页上的数据交互是通过提交我们点击鼠标的位置的坐标为参数,来实现数据请求的。我们无法从获取他的有效坐标,所以我们这里只能使用撒网式抓取。因为post提交的两个变化的数据为x,y;也就是我们的鼠标坐标。所以我们这里使用两个嵌套循环,将(100,100,800,800)这个范围的长方形里面的所有坐标点全部依次搞成参数进行请求,再进行数据的筛选过滤,因为数据量太多,我们这里使用多线程。

需导入的库:

import requests
from fake_useragent import UserAgent
from queue import Queue
import threading
import time

数据抓取函数:

ua=UserAgent(use_cache_server=False)
infos=[]
class get_infos(threading.Thread):
    def __init__(self,zb_queue,*args,**kwargs):
        super(get_infos, self).__init__(*args, **kwargs)
        self.zb_queue=zb_queue

    def run(self):
        while True:
            if self.zb_queue.empty():
                break
            data=self.zb_queue.get()
            self.spider(data)

    def spider(self,data):
        try:
            url = "http://ngac.org.cn/Kuangchandi/mapinfonew.ashx"
            response=requests.post(url,headers={'User-Agent':ua.random,},data=data)
            if response.text !='{"OBJECTID":"nothing"}':
                if response.text in infos:
                    pass
                else:
                    print(response.text)
                    infos.append(response.text)

        except:
            pass

这里我们使用多线程爬取,提高我们的运行效率。我们的代码是从队列中提取已经传入xy坐标的data。然后进行post请求,再进行过滤。因为有的坐标点没有数据,有的坐标点的数据是重复的,比如说我点上面地图上的一个圆点,我们点坐标(200,200)是他,点坐标(200,201)也是它,返回的数据都一样。所以我们这里利用判断列表是否存在这个值来进行去重。

控制主函数:

def main():
    zb_queue=Queue(2000000)
    for x in range(100,800):
        for y in range(100,800):
            data={'url': 'http://219.142.81.85/arcgis/services/0refield/MapServer/WMSServer?  request=getfeatureinfo&transparent=true&format=xml%2Fhtml&version=1.1.1&layers=0&query_layers=0&srs=EPSG%3A4326&X='+str(x)+'&Y='+str(y)+'&height=758&width=703&bbox=72.95344531249998%2C2.736753125000007%2C134.74055468749998%2C69.357846875',}
            zb_queue.put(data)
    print("data:over")
    for i in range(10):
        t=get_infos(zb_queue)
        t.start()
        time.sleep(0.02)
if __name__ == '__main__':
    main()

这里思路就是先将我们每次请求所需的每个点的data数据放进一个队列。然后将队列传入我们的类,进行多线程操作。这里加延迟的原因是,防止两个线程同时查看列表里是否存在相同的值,同时发现列表中无相同值,然后打印相同的结果,我们这里加上一点延迟,避免这种情况。

运行结果:

真夜猫.JPG

从我展示的部分信息上可以看出,我们这里已经成功的获取到了我们所需的信息。学会的朋友可以自己去试试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容