爬虫实例之爬取北京地铁站点
目标网站:https://www.bjsubway.com/station/zjgls/#
使用模块:re、os、requests、BeautifulSoup
老样子,直接步入正题。
先看下结果:
- 载入模块
import requests from bs4 import BeautifulSoup import re import os
接着接入网站,完成网站的解析。
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,这一点,可以从浏览器找到,以后再讲讲。
对了,爬取的时候遇到一个网站编码的问题。使用requests爬取的时候,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。即requests会对网站进行自动编码,以保证人能看得懂,所以一般不用再另外编码。但这个网站爬取的结果里的中文却是乱码,将其重新编码为"utf-8",发现更乱了,于是改成了“gbk”。
对于requests编码的问题,请参见:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html#id3
我们想要的“菜”是线路名称以及站点信息。分析网址发现,我们的“菜”被装在“<td colspan="5" ",即“td”tag里面。
但这么找之后发现,线路不全。比如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()) # 测试用
得到的就是包含所有线路名称的列表啦。
同样地,分析网页发现所有地站点信息都被存储在“<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格式才能调用正则表达式。
至此,所需要的数据已经全部拿到,接着就是文件的写入了:
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'模式就不会有问题了。
放一个整体代码:
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 + ' ') # 多来几个空格显得好看一点
不过本次爬虫还有一个小问题,就是没有将线路分开。想了一会没想到什么好的思路就没继续,可惜了我辛辛苦苦筛选出来的线路名称。知道的朋友可以评论区说明一下,感谢!
爬虫实例之爬取北京地铁站点相关推荐
- Python爬取全国地铁站点、地铁线路和发车时刻
爬取全国地铁站点.地铁线路和发车时刻的方法. 一.两种爬取方法概述 (一)html页面爬取 1. 为了收集全国地铁线路的发车时刻信息,刚开始尝试的方法如下: (1)找到每个城市的地铁官网,如& ...
- 2021-02-27爬虫实例(爬取照片)以虎牙为例
爬虫实例(爬取照片)以虎牙为例 开始之前点赞,投币加关注哦 开发环境:Python3.7 开发软件:PyCharm Edu 第一步:导入第三方库(模块) # 导入第三方库 import request ...
- Python爬虫实例: 爬取“最好大学网”大学排名
实例2 爬取大学排名 上海交通大学设计了一个"最好大学网",上面列出了当前的大学排名.我们要设计爬虫程序,爬取大学排名信息. 爬虫功能要求: 输入:大学排名URL链接 输出:大学排 ...
- Python爬虫(前言):有趣的一个爬虫实例(爬取段子,笑话,情感句子)
这次准备介绍Python爬虫爬取网页数据.解析并应用于实践,打算写几篇文章,从最基础的Python爬虫语法开始介绍爬虫,步步深入,最终实现一个较完整的实例. 这一系列文章包括: request库介绍及 ...
- Python爬虫实例:爬取 viveport 上 1406 款VR游戏信息
这次我们准备爬取 HTC VIVE 的VR内容平台--Viveport,上面有 1406 款优质的 VR 游戏/应用,本次我们的目标就是把这些游戏的详细信息爬取下来. 首先我们去该网站看一下(http ...
- python view函数_Python爬虫实例(二)——爬取新馆疫情每日新增人数
python是世界上最美的语言. 大家好,我是Henry! 疫情以来,相信大家每天都关注着疫情的实时动态,许多网站上也post了疫情的相关资料. 百香园 百度 各个网站都会统计每日新增,刚学了Matp ...
- Python 柱状图 横坐标 名字_Python爬虫实例(二)——爬取新馆疫情每日新增人数
python是世界上最美的语言. 大家好,我是Henry! 疫情以来,相信大家每天都关注着疫情的实时动态,许多网站上也post了疫情的相关资料. 百香园 百度 各个网站都会统计每日新增,刚学了Matp ...
- Python爬虫与信息提取(五)爬虫实例:爬取新浪微博热搜排名
经过一段时间的Python网络爬虫学习,今天自己摸索制作了一个能够爬取新浪微博实时热搜排名的小爬虫 1.效果: 2.制作过程中遇到的问题: (1)一开始研究微博热搜页面的源代码时忽略了<tbod ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
最新文章
- 据说这是大多数人【减肥】的真实写照
- 注意力机制的本质中文版代码
- cmake编译mysql常用参数
- LeetCode 1802. 有界数组中指定下标处的最大值(思维题)
- 一起学习C语言:结构体(一)
- ADO.net中临时表DataTable的简单应用
- Kettle Spoon入门教程
- 记一次勒索病毒攻击事件的处理过程
- 服务器安装cos系统,COS(国产操作系统)安装教程
- 【VBA宏编程】——Excel操作
- Linux SSH工具与wget、curl、scp命令详解
- PHOTOSHOP 小技巧
- elementUI重难点
- 树莓派学习笔记(九)树莓派Linux内核开发
- redis课程视频 黄建宏_求redis从入门到精通视频教程【50讲全】
- vue3-HTTP请求
- redis入门教程详解
- 2013年10月17日_羊豆豆_新浪博客
- 解读谷歌的AI杀手级专利:Dropout
- 第6章函数-6 缩写词(20分)