python 爬虫小案例 8684网站爬取北京公交路线站点信息。

网址:https://beijing.8684.cn/
通过点击1,2,3等发现网址为https://beijing.8684.cn/list1,2,3。
在这里插入图片描述
点击某一路,如10路,网址为https://beijing.8684.cn/x_8234e473。。采用quote(wd, encoding=“utf-8”)这样,还是不一样,笔者比较菜,应该是编码的问题,有谁知道欢迎留言。
本博客的思路就成了,首先获取1-9开头的公交的所有网址,而后通过解析获取,某路的站点信息,描述信息等。站点的经纬度信息通过百度API获取。

import requests
from urllib.parse import quote
import re
import pandas as pd
#x_5085a6b6
import time

def get_data(ur):
    url=r'https://beijing.8684.cn/x_'+ur
    da=requests.get(url)
    da.encoding='utf-8'
    da=da.text
    return da

def extract_info(da):
    Class = re.findall('<h1 class="title">(.*)<a href="/line1', da, re.S)
    category=re.findall('<a href="/line1" class="category">(.*)</a></h1>',da) 
    descr=re.findall('<ul class="bus-desc"><li>(.*)</li><li>票价',da)
    price_descr=re.findall('票价信息:(.*)</li><li>公交公司',da)
    print(Class[0],category[0],descr[0],price_descr[0])
    stas=re.findall('</div><div class="bus-lzlist mb15"><ol><li><a href="/(.*)</a></li></ol><!-- </ol> --></div><!----><div class="bus-excerpt mb15">',da)
    dd=str(stas).split('</a></li><li><a href="/')
    pat=re.compile(r'[\u4e00-\u9fa5]+')
    t=pat.findall(str(dd))
    sts=[]
    for i in range(0,len(t)):
        sts.append(t[i])
#    
    return sts
   # trip=re.findall('<div class="trip">(.*)</div></div><div class="other fr"><div class="total"',da)
  


def get_lat_lon(address):

    url= 'http://api.map.baidu.com/geocoder?output=json&key=f247cdb592eb43ebac6ccd27f796e2d2&address='+str(address)
    response = requests.get(url)
    answer = response.json()
    lon = float(answer['result']['location']['lng'])
    lat = float(answer['result']['location']['lat'])
#    print(address,lat,lon)
    return lat,lon





def get_bus_num_url(i):
    url=r'https://beijing.8684.cn/list'+str(i)
    da=requests.get(url)
    da.encoding='utf-8'
    da=da.text
    dd=re.findall('<a href="/x_(.*)" title="北京(.*)路公交车路线">',da)
    a=str(dd).split('</a><a href="/x')
    for add in a[:-1]:
        ur=re.findall('[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]+',add)[0]
        route=re.findall('title=(.*)>',str(add))
#        print(route[0],ur)
        url_dic[route[0]]=ur

url_dic={}
for i in range(5,10):
#    print(i)
    get_bus_num_url(i)



result= pd.DataFrame(columns = ['站点','经度','纬度'])
keys=url_dic.keys()
for key in keys:
    try:
        
        da=get_data(url_dic[key])
        sts=extract_info(da)
    
        for add in sts:
        #    print(address)
            address='北京市'+add
           
            lat,lon=get_lat_lon('北京市'+address)
            print(address,lat,lon)
            result=result.append({'站点':add,'经度':lat,'纬度':lon},ignore_index=True)
    except:
        pass
        

效果图
在这里插入图片描述
笔者对爬虫涉猎不多,代码能力也很粗糙,欢迎大佬批评指正。读者可将这些信息保存只表中,有了经纬度信息,就可利用arcgis软件进行数字化展示。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是菜鸡,我不敢睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值