目的: 练习使用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)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐