抓取每路公交的具体信息

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

@
目录

1.抓取查询路径:

抓取 https://lanzhou.8684.cn/ 中以数字开头的公交线路的查询路径。
  1.     <a target="_blank" href="https://www.cnblogs.com/list1">1</a>
  2.     <a target="_blank" href="https://www.cnblogs.com/list2">2</a>
  3.     <a target="_blank" href="https://www.cnblogs.com/list3">3</a>
  4.     <a target="_blank" href="https://www.cnblogs.com/list4">4</a>
  5.     <a target="_blank" href="https://www.cnblogs.com/list5">5</a>
  6.     <a target="_blank" href="https://www.cnblogs.com/list6">6</a>
  7.     <a target="_blank" href="https://www.cnblogs.com/list7">7</a>
  8.     <a target="_blank" href="https://www.cnblogs.com/list8">8</a>
  9.     <a target="_blank" href="https://www.cnblogs.com/list9">9</a>
复制代码
这里所看到的 href 属性值,加上 https://lanzhou.8684.cn/ 就是将来的查询地址。
以此抓取所有的数字开头的公交线路。:
  1. https://lanzhou.8684.cn/listX
复制代码
其中末尾的 X 表示 数字 1 ~ 9
如:https://lanzhou.8684.cn/list1
2.拼接每路公交的线路链接:

抓取 https://lanzhou.8684.cn/listX中每路公交的线路链接。
  1.         <a target="_blank" href="https://www.cnblogs.com/x_24f5dad9" title="兰州1路公交车路线">1路</a>
  2.         <a target="_blank" href="https://www.cnblogs.com/x_8234e473" title="兰州10路公交车路线">10路</a>
  3.         <a target="_blank" href="https://www.cnblogs.com/x_26ecc8ae" title="兰州11路公交车路线">11路</a>
  4.         <a target="_blank" href="https://www.cnblogs.com/x_27905c0e" title="兰州12路公交车路线">12路</a>
  5.         <a target="_blank" href="https://www.cnblogs.com/x_9023980b" title="兰州13路公交车路线">13路</a>
  6.         <a target="_blank" href="https://www.cnblogs.com/x_be53b447" title="兰州14路公交车路线">14路</a>
  7.         <a target="_blank" href="https://www.cnblogs.com/x_5a54ae14" title="兰州15路公交车路线">15路</a>
  8.         <a target="_blank" href="https://www.cnblogs.com/x_968a4331" title="兰州16路公交车路线">16路</a>
  9.         <a target="_blank" href="https://www.cnblogs.com/x_4177a33a" title="兰州17路公交车路线">17路</a>
  10.         <a target="_blank" href="https://www.cnblogs.com/x_bfe4a3eb" title="兰州18路公交车路线">18路</a>
  11.         ...
复制代码
这里所看到的 href 属性值,加上 https://lanzhou.8684.cn/ 就是每路公交的线路链接。
如:https://lanzhou.8684.cn/x_24f5dad9
以此抓取所有线路链接。:
3.抓取每路公交的具体信息
  1. 兰州9路公交车路线[市区线路]
  2. 运行时间:西关什字6:00-22:30|晟地兰州汽配城6:00-21:40
  3. 参考票价:无人售票车,1.0元一票制,支持交联IC卡/云闪付/微信/支付宝/万支付/翼支付/美团支付等多种支付方式
  4. 公交公司:兰州公交集团第五客运公司
复制代码
4. 实现代码
  1. # author:Aurora
  2. # Datetime:2022-6-24 11:41:00
  3. """
  4. 抓取每路公交的具体信息
  5. title:
  6. run_time:
  7. tickets_price:
  8. bus_company:
  9. """
  10. # 所有库
  11. import requests
  12. import re
  13. from bs4 import BeautifulSoup
  14. import pandas as pd
  15. import os
  16. import time
  17. # 进度条
  18. def progress():
  19.     for i in range(101):
  20.         time.sleep(0.05)
  21.         print(f"\r进度:{'-'*i} {i}%", end='')
  22.     return 200
  23. # 获取信息函数
  24. def get_every_raod_bus_info():
  25.     url = "https://lanzhou.8684.cn/"
  26.     # 伪造header
  27.     headers = {
  28.         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44"
  29.     }
  30.     response = requests.get(url=url, headers=headers)
  31.     soup = BeautifulSoup(response.text, features='lxml')
  32.     """
  33.     兰州公交线路:
  34.     1. 以数字开头
  35.     2. 以汉字/字母开头
  36.     3. 线路分类
  37.     都在三个类为pl10的标签中,获取它们
  38.     """
  39.     # 获取第一个pl10也就就是以数字开头,
  40.     items = soup.select('.pl10')[0]
  41.     # 获取list
  42.     list = items.select('.list')
  43.     list = list[0] if len(list) > 0 else ''
  44.     # 获取list里面的a标签
  45.     a = list.select('a')
  46.     # 获取属性href:['/list','/list2',..,'/list9'],listX,X代表不同数字开头的公家车,1,11,12,119,110路等公交车
  47.     hrefs = [i['href'] for i in a]
  48.     link = "https://lanzhou.8684.cn/"
  49.     # 1. 拼接查询地址https://lanzhou.8684.cn/listX,X[1-9],就是每个数字开头的公公交车
  50.     # 输入数字开头的公交线路(1-9)
  51.     n1 = eval(input("请输入以数字开头的公车(1-9):"))
  52.     links = []
  53.     links.append(link+hrefs[n1-1])
  54.     print(links)
  55.     # 2. 拼接每路公交的线路链接
  56.     """
  57.     格式如下
  58.     1:https://lanzhou.8684.cn/x_24f5dad9
  59.     10:https://lanzhou.8684.cn/x_8234e473
  60.     11:https://lanzhou.8684.cn/x_26ecc8ae
  61.     ...
  62.     https://lanzhou.8684.cn/XXXX
  63.     """
  64.     # 每路公交的链接列表
  65.     road_list = []
  66.     # 链接前缀
  67.     all_road_prefix = "https://lanzhou.8684.cn"
  68.     for url in links:
  69.         response = requests.get(url, headers=headers)
  70.         soup = BeautifulSoup(response.text, features='lxml')
  71.         # 获取list
  72.         lists = soup.select('.list')
  73.         list = lists[0] if len(lists) > 0 else ''
  74.         # 获取里面的a标签
  75.         a = list.select('a')
  76.         for i in a:
  77.             # 取属性href然后拼接后存入到road_list
  78.             road_list.append(all_road_prefix+i['href'])
  79.     print(road_list)
  80.     # 3. 获取每路公交的信息
  81.     """
  82.     title:
  83.     run_time:
  84.     tickets_price:
  85.     bus_company:
  86.     last_updated:
  87.     """
  88.     road_info_dic = {}
  89.     title_list = []
  90.     run_time_list = []
  91.     ticket_price_list = []
  92.     bus_company_list = []
  93.     last_updated_list = []
  94.     n = 1
  95.     for road_url in road_list:
  96.         response = requests.get(road_url, headers=headers)
  97.         soup = BeautifulSoup(response.text, features='lxml')
  98.         # 获取信息(返回的是列表)
  99.         info = soup.select('.info')
  100.         # print(info)
  101.         # 判断是否为空
  102.         info = info[0] if len(info) > 0 else ''
  103.         # 获取所有span标签
  104.         spans = info.select('span')
  105.         """
  106.         [兰州1路公交车路线, 公交公司:, 最后更新:2022-06-24]
  107.         """
  108.         # 标题:兰州1路公交车路线
  109.         title = spans[0].text
  110.         # 获取所有a标签
  111.         a = info.select('a')
  112.         """
  113.         [<a aria-label="市区线路,按回车键查看全部市区线路"  target="_blank" href="https://www.cnblogs.com/line1">[市区线路]</a>, <a aria-label="兰州公交集团第一客运公司,按回车键查看全部兰州公交
  114.         集团第一客运公司运营的公交线路。" target="_blank" href="https://www.cnblogs.com/g21" title="兰州公交集团第一客运公司">兰州公交集团第一客运公司</a>]
  115.         """
  116.         # 发现副标题category在第一个a标签里面
  117.         # 副标题:[市区线路]
  118.         categorys = a[0].text
  119.         # 拼接总标题
  120.         # 总标题: 兰州9路公交车路线[市区线路]
  121.         titles = title+categorys
  122.         title_list.append(titles)
  123.         print(titles)
  124.         # 获取所用信息描述:ul标签
  125.         bus_descs = info.select('.bus-desc')
  126.         bus_desc = bus_descs[0] if len(bus_descs) > 0 else ''
  127.         # 获取所有li标签(信息都在li中)如下:
  128.         lis = bus_desc.select('li')
  129.         # print(lis)
  130.         """
  131.         [<li tabindex="0">运行时间:兰州西站5:55-00:00|兰州车站5:40-00:00</li>, <li tabindex="0">参考票价:无人售票车,1.0元一票制,支持交联IC卡/云闪付/微信/支付宝/万支付/
  132.         翼支付/美团支付等多种支付方式</li>, <li>公交公司:<a aria-label="兰州公交集团第一客运公司,按回车键查看全部兰州公交集团第一客运公司运营的
  133.         公交线路。" target="_blank" href="https://www.cnblogs.com/g21" title="兰州公交集团第一客运公司">兰州公交集团第一客运公司</a></li>, <li>最后更新:2022-06-24<i ></i>免费发送线路信息到微信</li>, <li tabindex="0">※ 本查询结果仅供参考,车程及票价请以实际发生为准</li>]
  134.         """
  135.         # 从lis中获取想要的信息:
  136.         # 1. 运行时间
  137.         run_times = lis[0].text
  138.         run_time_list.append(run_times)
  139.         print(run_times)
  140.         # 2. 参考票价
  141.         tickets_price = lis[1].text
  142.         ticket_price_list.append(tickets_price)
  143.         print(tickets_price)
  144.         # 3. 公交公司
  145.         """
  146.         <li>公交公司:<a aria-label="兰州公交集团第一客运公司,按回车键查看全部兰州公交集团第一客运公司运营的 公交线路。" target="_blank" href="https://www.cnblogs.com/g21" title="兰州公交集团第一客运公司">兰州公交集团第一客运公司</a></li>,
  147.         """
  148.         bus_companies = lis[2].text
  149.         bus_company_list.append(bus_companies)
  150.         print(bus_companies)
  151.         # 4. 最后更新时间
  152.         last_updated = lis[3].text
  153.         last_updated_list.append(last_updated)
  154.         print(last_updated)
  155.         print("-"*120)
  156.         time.sleep(1)
  157.         n += 1
  158.         # 将最后的结果保存到字典中
  159.         try:
  160.             road_info_dic.update({"title": title_list, "run_time": run_time_list, "ticket_price": ticket_price_list,
  161.                                   "bus_company": bus_company_list, "last_updated": last_updated_list})
  162.             print("信息保持字典成成功~~~")
  163.         except Exception as e:
  164.             print("信息保持字典失败:"+e)
  165.     print(f"获取信息成功,共获取 {n-1} 条信息")
  166.     # print(road_info_dic)
  167.     print("-"*120)
  168.     info_df = pd.DataFrame(road_info_dic)
  169.     print(f"{n1} 字头公交车所有线路信息为:")
  170.     print(info_df)
  171.     # 保存为csv文件(不同数字开头的公交车存为不同的文件,就是输入的数字)
  172.     try:
  173.         print("信息开始存入csv文件")
  174.         progress()
  175.         info_df.to_csv(os.path.join(os.getcwd(), 'files/') +
  176.                        f"bus{n1}_info.csv", index=False, encoding='gbk')
  177.         path = os.path.join(os.getcwd(), 'files')
  178.         print("\n")
  179.         print(f"保存csv文件成功,请在{path}文件夹下查看")
  180.     except Exception as e:
  181.         print("保存csv文件失败"+e)
  182. get_every_raod_bus_info()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表