目的: 练习使用beautfulsoup库的使用,爬取需要的数据信息
使用到的库: sys, BeautifulSoup, requests
code:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#爬取网页中对应每条公交线路的信息(线路名称,起点,终点,首发时间等)
import sys
from bs4 import BeautifulSoup
import requests
# 解决ascii编码问题
reload(sys)
sys.setdefaultencoding('utf8')
#每条公交链接存取在该文件中
timeTable = 'c:/bus_time.txt'
def save_info(data, target_file):
f = open(target_file, 'a')
f.write(data + '\n')
f.close()
# 获取页面内容
url = 'http://shanghai.gongjiao.com/lines_all.html'
res = requests.request('GET', url)
# 返回结果为200为正确
print (res.status_code)
pageText = res.content
#使用bs库创建对象并解析获取所有线路的链接地址并保存到文件
html = BeautifulSoup(pageText, 'html.parser')
busSites = html.find('div', class_='list').find_all('li')
for siteInfo in busSites:
siteUrls = siteInfo.find('a').attrs['href']
siteNames = siteInfo.find('a').get_text()
save_info(siteUrls, timeTable)
#从文件的链接中读取每一个站点的信息并输出
def bus_line_info(busTime):
f = open(busTime, 'r')
for siteUrl in f.readlines():
res = requests.request('GET', siteUrl)
pageText = res.content
html = BeautifulSoup(pageText, 'html.parser')
busLine = html.find('div', class_='gj01_line_header clearfix')
#获取tag下的车辆号码
lineName = busLine.find('h4').get_text()
#获取首班车时间
lineTime = busLine.find('dl').find('dd').get_text()
#获取起点和终点的数据tag列表,然后从列表的下标中取出每个元素对象的text值(此处因为tag a有两个,从属性区分不方便,所以考虑先全部获取,
# 取得的类型是<class 'bs4.element.ResultSet'>,再从该列表中去下标的单个元素类型是<class 'bs4.element.Tag'>)
startSite = (busLine.find('dl').find('dt').find_all('a'))[0].get_text()
endSite = (busLine.find('dl').find('dt').find_all('a'))[1].get_text()
print ('bus line name: {}'.format(lineName))
print ('bus line time: {}'.format(lineTime))
print ('bus forward {} ==> {}:'.format(startSite, endSite))
bus_line_info(timeTable)