Python爬虫实例_城市公交网络站点数据的爬取方法


Posted in Python onJanuary 10, 2018

爬取的站点:http://beijing.8684.cn/

Python爬虫实例_城市公交网络站点数据的爬取方法

(1)环境配置,直接上代码:

# -*- coding: utf-8 -*-
import requests ##导入requests
from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
import os
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}
all_url = 'http://beijing.8684.cn' ##开始的URL地址
start_html = requests.get(all_url, headers=headers) 
#print (start_html.text)
Soup = BeautifulSoup(start_html.text, 'lxml') # 以lxml的方式解析html文档

(2)爬取站点分析

1、北京市公交线路分类方式有3种:

Python爬虫实例_城市公交网络站点数据的爬取方法

本文通过数字开头来进行爬取,“F12”启动开发者工具,点击“Elements”,点击“1”,可以发现链接保存在<div class="bus_kt_r1">里面,故只需要提取出div里的href即可:

Python爬虫实例_城市公交网络站点数据的爬取方法

代码

all_a = Soup.find(‘div',class_='bus_kt_r1').find_all(‘a')

2、接着往下,发现每1路的链接都在<div id="con_site_1" class="site_list"> <a>里面,取出里面的herf即为线路网址,其内容即为线路名称,代码

href = a['href'] #取出a标签的href 属性
html = all_url + href
second_html = requests.get(html,headers=headers)
#print (second_html.text)
Soup2 = BeautifulSoup(second_html.text, 'lxml') 
all_a2 = Soup2.find('div',class_='cc_content').find_all('div')[-1].find_all('a') # 既有id又有class的div不知道为啥取不出来,只好迂回取了

3、打开线路链接,就可以看到具体的站点信息了,打开页面分析文档结构后发现:线路的基本信息存放在<div class="bus_i_content">里面,而公交站点信息则存放在<div class="bus_line_top"><div class="bus_line_site">里面,提取代码:

Python爬虫实例_城市公交网络站点数据的爬取方法

title1 = a2.get_text() #取出a1标签的文本
href1 = a2['href'] #取出a标签的href 属性
#print (title1,href1)
html_bus = all_url + href1 # 构建线路站点url
thrid_html = requests.get(html_bus,headers=headers)
Soup3 = BeautifulSoup(thrid_html.text, 'lxml') 
bus_name = Soup3.find('div',class_='bus_i_t1').find('h1').get_text() # 提取线路名
bus_type = Soup3.find('div',class_='bus_i_t1').find('a').get_text() # 提取线路属性
bus_time = Soup3.find_all('p',class_='bus_i_t4')[0].get_text() # 运行时间
bus_cost = Soup3.find_all('p',class_='bus_i_t4')[1].get_text() # 票价
bus_company = Soup3.find_all('p',class_='bus_i_t4')[2].find('a').get_text() # 公交公司
bus_update = Soup3.find_all('p',class_='bus_i_t4')[3].get_text() # 更新时间
bus_label = Soup3.find('div',class_='bus_label')
if bus_label:
 bus_length = bus_label.get_text() # 线路里程
else:
 bus_length = []
#print (bus_name,bus_type,bus_time,bus_cost,bus_company,bus_update)
all_line = Soup3.find_all('div',class_='bus_line_top') # 线路简介
all_site = Soup3.find_all('div',class_='bus_line_site')# 公交站点
line_x = all_line[0].find('div',class_='bus_line_txt').get_text()[:-9]+all_line[0].find_all('span')[-1].get_text()
sites_x = all_site[0].find_all('a')
sites_x_list = [] # 上行线路站点
for site_x in sites_x:
 sites_x_list.append(site_x.get_text())
line_num = len(all_line)
if line_num==2: # 如果存在环线,也返回两个list,只是其中一个为空
 line_y = all_line[1].find('div',class_='bus_line_txt').get_text()[:-9]+all_line[1].find_all('span')[-1].get_text()
 sites_y = all_site[1].find_all('a')
 sites_y_list = [] # 下行线路站点
 for site_y in sites_y:
 sites_y_list.append(site_y.get_text())
else:
 line_y,sites_y_list=[],[]
information = [bus_name,bus_type,bus_time,bus_cost,bus_company,bus_update,bus_length,line_x,sites_x_list,line_y,sites_y_list]

自此,我们就把一条线路的相关信息及上、下行站点信息就都解析出来了。如果想要爬取全市的公交网络站点,只需要加入循环就可以了。

完整代码:

# -*- coding: utf-8 -*-
# Python3.5
import requests ##导入requests
from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
import os
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}
all_url = 'http://beijing.8684.cn' ##开始的URL地址
start_html = requests.get(all_url, headers=headers) 
#print (start_html.text)
Soup = BeautifulSoup(start_html.text, 'lxml')
all_a = Soup.find('div',class_='bus_kt_r1').find_all('a')
Network_list = []
for a in all_a:
 href = a['href'] #取出a标签的href 属性
 html = all_url + href
 second_html = requests.get(html,headers=headers)
 #print (second_html.text)
 Soup2 = BeautifulSoup(second_html.text, 'lxml') 
 all_a2 = Soup2.find('div',class_='cc_content').find_all('div')[-1].find_all('a') # 既有id又有class的div不知道为啥取不出来,只好迂回取了
 for a2 in all_a2:
 title1 = a2.get_text() #取出a1标签的文本
 href1 = a2['href'] #取出a标签的href 属性
 #print (title1,href1)
 html_bus = all_url + href1
 thrid_html = requests.get(html_bus,headers=headers)
 Soup3 = BeautifulSoup(thrid_html.text, 'lxml') 
 bus_name = Soup3.find('div',class_='bus_i_t1').find('h1').get_text()
 bus_type = Soup3.find('div',class_='bus_i_t1').find('a').get_text()
 bus_time = Soup3.find_all('p',class_='bus_i_t4')[0].get_text()
 bus_cost = Soup3.find_all('p',class_='bus_i_t4')[1].get_text()
 bus_company = Soup3.find_all('p',class_='bus_i_t4')[2].find('a').get_text()
 bus_update = Soup3.find_all('p',class_='bus_i_t4')[3].get_text()
 bus_label = Soup3.find('div',class_='bus_label')
 if bus_label:
  bus_length = bus_label.get_text()
 else:
  bus_length = []
 #print (bus_name,bus_type,bus_time,bus_cost,bus_company,bus_update)
 all_line = Soup3.find_all('div',class_='bus_line_top')
 all_site = Soup3.find_all('div',class_='bus_line_site')
 line_x = all_line[0].find('div',class_='bus_line_txt').get_text()[:-9]+all_line[0].find_all('span')[-1].get_text()
 sites_x = all_site[0].find_all('a')
 sites_x_list = []
 for site_x in sites_x:
  sites_x_list.append(site_x.get_text())
 line_num = len(all_line)
 if line_num==2: # 如果存在环线,也返回两个list,只是其中一个为空
  line_y = all_line[1].find('div',class_='bus_line_txt').get_text()[:-9]+all_line[1].find_all('span')[-1].get_text()
  sites_y = all_site[1].find_all('a')
  sites_y_list = []
  for site_y in sites_y:
  sites_y_list.append(site_y.get_text())
 else:
  line_y,sites_y_list=[],[]
 information = [bus_name,bus_type,bus_time,bus_cost,bus_company,bus_update,bus_length,line_x,sites_x_list,line_y,sites_y_list]
 Network_list.append(information)
# 定义保存函数,将运算结果保存为txt文件
def text_save(content,filename,mode='a'):
 # Try to save a list variable in txt file.
 file = open(filename,mode)
 for i in range(len(content)):
 file.write(str(content[i])+'\n')
 file.close()
# 输出处理后的数据 
text_save(Network_list,'Network_bus.txt');

最后输出整个城市的公交网络站点信息,这次就先保存在txt文件里吧,也可以保存到数据库里,比如mysql或者MongoDB里,这里我就不写了,有兴趣的可以试一下,附上程序运行后的结果图:

Python爬虫实例_城市公交网络站点数据的爬取方法

以上这篇Python爬虫实例_城市公交网络站点数据的爬取方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Django框架中if标签的相关使用
Jul 15 Python
Python带动态参数功能的sqlite工具类
May 26 Python
python3+selenium自动化测试框架详解
Mar 17 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
Pandas分组与排序的实现
Jul 23 Python
学python最电脑配置有要求么
Jul 05 Python
使用Python pip怎么升级pip
Aug 11 Python
Python 测试框架unittest和pytest的优劣
Sep 26 Python
python 实现超级玛丽游戏
Nov 25 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
Python 使用dict实现switch的操作
Apr 07 Python
python元组打包和解包过程详解
Aug 02 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 #Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 #Python
Python中join函数简单代码示例
Jan 09 #Python
Python中顺序表的实现简单代码分享
Jan 09 #Python
python中set()函数简介及实例解析
Jan 09 #Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 #Python
深入了解Python中pop和remove的使用方法
Jan 09 #Python
You might like
用文本文件制作留言板提示(下)
2006/10/09 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
Python----数据预处理代码实例
2019/03/20 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
python编写微信公众号首图思路详解
2019/12/13 Python
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
网游商务专员求职信
2013/10/15 职场文书
考博自荐信
2013/10/25 职场文书
个人简历中的自我评价范例
2013/10/29 职场文书
工作睡觉检讨书
2014/02/25 职场文书
购房委托书范本
2014/09/18 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书