目标网站:https://www.bjsubway.com/station/zjgls/#

使用模块:reosrequestsBeautifulSoup

老样子,直接步入正题。

先看下结果:

北京地铁各站点间距离一览
  1. 载入模块

    import requests
    from bs4 import BeautifulSoup
    import re
    import os
  2. 接着接入网站,完成网站的解析。

    ul = 'https://www.bjsubway.com/station/zjgls/#'
    response = requests.get(ul)
    response.encoding = 'gbk'  # 原始网页编码错误,utf-8也不管用,只能用gbk
    html = response.text
    # print(html)
    soup = BeautifulSoup(html, 'lxml')  # 变成汤汁
    

    由于爬取的次数不多,该网站没有作直接限制,个人猜测是有次数限制的。至于次数是多少,感兴趣的朋友可以拿自己的IP撞撞枪口[/doge]。保险的方法是加上自己的User Agent,这一点,可以从浏览器找到,以后再讲讲。

  3. 对了,爬取的时候遇到一个网站编码的问题。使用requests爬取的时候,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。即requests会对网站进行自动编码,以保证人能看得懂,所以一般不用再另外编码。但这个网站爬取的结果里的中文却是乱码,将其重新编码为"utf-8",发现更乱了,于是改成了“gbk”。

  4. 对于requests编码的问题,请参见:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html#id3

  5. 我们想要的“菜”是线路名称以及站点信息。分析网址发现,我们的“菜”被装在“<td colspan="5" ",即“td”tag里面。

    一号线示例

    但这么找之后发现,线路不全。比如2号线就没找到,再分析2号线的代码:

    2号线

    那再把colspan = '7'加进去吧,结果发现还少几条线。原来还有colspan = '6' 和colspan = '9'(十号线,仅此一条)。这样一来,重复的代码有点多,写成一个函数:

    def get_txt_name():  # 得到线路名称的前一步txt_src_name = []for i in range(5, 10):temp = soup.find_all('td', {'colspan': str(i)})txt_src_name += tempreturn txt_src_name# 格式如[<td colspan="6">15号线相邻站间距信息统计表</td>, <td colspan="6">昌平线相邻站间距信息统计表</td>]
    # print(get_txt_name())  # 测试用
    def get_txtuseful_name():  # 得到可用的线路名称obj = []for each in get_txt_name():temp = re.findall(r">(.+?)<", str(each))  # 从>匹配到<(不包含),若要包含,则先使用re.compile,再searchobj += tempreturn obj
    # print(get_txtuseful_name())  # 测试用

    得到的就是包含所有线路名称的列表啦。

  6. 同样地,分析网页发现所有地站点信息都被存储在“<tbody>”这个tag中,于是同样地进行查找并筛选:

    Stationinfo = soup.find_all('tbody')  # 汤汁是ResultSet,即结果集
    def get_stationinfo():obj = []for each in Stationinfo:temp = re.findall(r">(.+?)<", str(each))   # 正则匹配,str格式obj += tempreturn obj
    # print(get_stationinfo())

    到了tbody之后,剩下的数据就没有tag可用了,只能用正则表达式来匹配。查找">xxxx<"的"xxx"即为站点信息。

    还有一点要注意,要把soup中的ResultSet转换成str格式才能调用正则表达式。

  7. 至此,所需要的数据已经全部拿到,接着就是文件的写入了:

    station_list = get_stationinfo()
    # print(station_list)
    os.makedirs('./线路图/', exist_ok=True)
    with open('./线路图/test.txt', 'w') as f:  # 不能是wb,编码有问题,或者str转换成bytefor line in station_list:if line == '上行/下行':f.write(line + '\n')else:f.write(line + '      ')  # 多来几个空格显得好看一点

    还是编码问题,前面是str格式的,如果写入文件的格式为'b',即二进制,则会报错。解决的方法是第一像代码那样仅仅是'w'模式 ;或者在此之前将station_list转换成byte格式,那么使用'wb'模式就不会有问题了。

  8. 放一个整体代码:

    import requests
    from bs4 import BeautifulSoup
    import re
    import osul = 'https://www.bjsubway.com/station/zjgls/#'
    response = requests.get(ul)
    response.encoding = 'gbk'  # 原始网页编码错误,utf-8也不管用,只能用gbk
    html = response.text
    # print(html)
    soup = BeautifulSoup(html, 'lxml')  # 变成汤汁def get_txt_name():  # 得到线路名称的前一步txt_src_name = []for i in range(5, 10):temp = soup.find_all('td', {'colspan': str(i)})txt_src_name += tempreturn txt_src_name# 格式如[<td colspan="6">15号线相邻站间距信息统计表</td>, <td colspan="6">昌平线相邻站间距信息统计表</td>]
    # print(get_txt_name())  # 测试用
    def get_txtuseful_name():  # 得到可用的线路名称obj = []for each in get_txt_name():temp = re.findall(r">(.+?)<", str(each))  # 从>匹配到<(不包含),若要包含,则先使用re.compile,再searchobj += tempreturn obj
    # print(get_txtuseful_name())  # 测试用Stationinfo = soup.find_all('tbody')
    def get_stationinfo():obj = []for each in Stationinfo:temp = re.findall(r">(.+?)<", str(each))obj += tempreturn obj
    # print(get_stationinfo())station_list = get_stationinfo()
    # print(station_list)
    os.makedirs('./线路图/', exist_ok=True)
    with open('./线路图/test.txt', 'w') as f:  # 不能是wb,编码有问题,或者str转换成bytefor line in station_list:if line == '上行/下行':f.write(line + '\n')else:f.write(line + '      ')  # 多来几个空格显得好看一点
    
  9. 不过本次爬虫还有一个小问题,就是没有将线路分开。想了一会没想到什么好的思路就没继续,可惜了我辛辛苦苦筛选出来的线路名称。知道的朋友可以评论区说明一下,感谢!

爬虫实例之爬取北京地铁站点相关推荐

  1. Python爬取全国地铁站点、地铁线路和发车时刻

    爬取全国地铁站点.地铁线路和发车时刻的方法. 一.两种爬取方法概述  (一)html页面爬取    1. 为了收集全国地铁线路的发车时刻信息,刚开始尝试的方法如下: (1)找到每个城市的地铁官网,如& ...

  2. 2021-02-27爬虫实例(爬取照片)以虎牙为例

    爬虫实例(爬取照片)以虎牙为例 开始之前点赞,投币加关注哦 开发环境:Python3.7 开发软件:PyCharm Edu 第一步:导入第三方库(模块) # 导入第三方库 import request ...

  3. Python爬虫实例: 爬取“最好大学网”大学排名

    实例2 爬取大学排名 上海交通大学设计了一个"最好大学网",上面列出了当前的大学排名.我们要设计爬虫程序,爬取大学排名信息. 爬虫功能要求: 输入:大学排名URL链接 输出:大学排 ...

  4. Python爬虫(前言):有趣的一个爬虫实例(爬取段子,笑话,情感句子)

    这次准备介绍Python爬虫爬取网页数据.解析并应用于实践,打算写几篇文章,从最基础的Python爬虫语法开始介绍爬虫,步步深入,最终实现一个较完整的实例. 这一系列文章包括: request库介绍及 ...

  5. Python爬虫实例:爬取 viveport 上 1406 款VR游戏信息

    这次我们准备爬取 HTC VIVE 的VR内容平台--Viveport,上面有 1406 款优质的 VR 游戏/应用,本次我们的目标就是把这些游戏的详细信息爬取下来. 首先我们去该网站看一下(http ...

  6. python view函数_Python爬虫实例(二)——爬取新馆疫情每日新增人数

    python是世界上最美的语言. 大家好,我是Henry! 疫情以来,相信大家每天都关注着疫情的实时动态,许多网站上也post了疫情的相关资料. 百香园 百度 各个网站都会统计每日新增,刚学了Matp ...

  7. Python 柱状图 横坐标 名字_Python爬虫实例(二)——爬取新馆疫情每日新增人数

    python是世界上最美的语言. 大家好,我是Henry! 疫情以来,相信大家每天都关注着疫情的实时动态,许多网站上也post了疫情的相关资料. 百香园 百度 各个网站都会统计每日新增,刚学了Matp ...

  8. Python爬虫与信息提取(五)爬虫实例:爬取新浪微博热搜排名

    经过一段时间的Python网络爬虫学习,今天自己摸索制作了一个能够爬取新浪微博实时热搜排名的小爬虫 1.效果: 2.制作过程中遇到的问题: (1)一开始研究微博热搜页面的源代码时忽略了<tbod ...

  9. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

最新文章

  1. 据说这是大多数人【减肥】的真实写照
  2. 注意力机制的本质中文版代码
  3. cmake编译mysql常用参数
  4. LeetCode 1802. 有界数组中指定下标处的最大值(思维题)
  5. 一起学习C语言:结构体(一)
  6. ADO.net中临时表DataTable的简单应用
  7. Kettle Spoon入门教程
  8. 记一次勒索病毒攻击事件的处理过程
  9. 服务器安装cos系统,COS(国产操作系统)安装教程
  10. 【VBA宏编程】——Excel操作
  11. Linux SSH工具与wget、curl、scp命令详解
  12. PHOTOSHOP 小技巧
  13. elementUI重难点
  14. 树莓派学习笔记(九)树莓派Linux内核开发
  15. redis课程视频 黄建宏_求redis从入门到精通视频教程【50讲全】
  16. vue3-HTTP请求
  17. redis入门教程详解
  18. 2013年10月17日_羊豆豆_新浪博客
  19. 解读谷歌的AI杀手级专利:Dropout
  20. 第6章函数-6 缩写词(20分)

热门文章

  1. Crowd Control
  2. 1.6 极限存在准则 两个重要极限
  3. PostgreSQL使用Navicat连接pgsql时出现authentication method 10 not supported的解决办法
  4. SHAR1,获取不同,release版本SHAR1,debug版本SHAR1,导致定位失败,经纬度获取为0
  5. Nginx的静态资源缓存以及压缩
  6. 人工智能-自动机模型
  7. Unity Atlas
  8. unity动态生成render texture
  9. 路客网王鑫光:2012是团购移动电商年
  10. 我和 TiDB 的故事 | 缘份在,那就终是能相遇的