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实例之wxpython中Frame使用方法
Jun 09 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
Python语言异常处理测试过程解析
Jan 08 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
python 制作磁力搜索工具
Mar 04 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
php中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
python元组操作实例解析
2014/09/23 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
python tkinter组件使用详解
2019/09/16 Python
Python模块常用四种安装方式
2020/10/20 Python
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
博士毕业生自我鉴定范文
2014/04/13 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
违反交通法规检讨书
2014/09/10 职场文书
英文商务邀请函范文
2015/01/31 职场文书
公务员政审个人总结
2015/02/12 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
教师节联欢会主持词
2015/07/04 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python