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基础教程之正则表达式基本语法以及re模块
Mar 25 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
Python实现多并发访问网站功能示例
Jun 19 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
利用nohup来开启python文件的方法
Jan 14 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
Python更新所有已安装包的操作
Feb 13 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
Python调用C/C++的方法解析
Aug 05 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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
node.js入门教程
2014/06/01 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
护理专业毕业生自荐信范文
2014/01/05 职场文书
个人评价范文分享
2014/01/11 职场文书
优秀教师获奖感言
2014/01/31 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
2014会计年终工作总结
2014/12/20 职场文书