【Python】Python简单网络爬虫-爬取近几年的天气数据

Python简单网络爬虫

引用的包

import urllib2
import random
import csv
import datetime
from bs4 import BeautifulSoup
  • urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件,他以urlopen函数的形式提供了一个非常简单的接口
  • csv:通用的一种文件格式, 将数据写入到csv文件中
  • BeautifulSoup:用来代替正则式取源码中相应标签中的内容

主程序

#-*-coding:utf-8-*-

import urllib2
import random
import csv
import datetime
from bs4 import BeautifulSoup

my_headers = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)        Chrome/48.0.2564.116 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/45.0.2454.101 Safari/537.36"
        ]

def get_content(url, headers):
    '''
    随机选择my_headers中一个模拟浏览器访问
    '''
    random_header = random.choice(headers)
    request = urllib2.Request(url)
    request.add_header("User-Agent", random_header)
    request.add_header("Host", "lishi.tianqi.com")
    request.add_header("Referer", "http://lishi.tianqi.com/")
    request.add_header("GET", url)

    html = urllib2.urlopen(request)
    content = html.read().decode("gbk").encode("utf-8")
    html.close()
    return content

def get_link(html_text):
    '''
    获取所有的链接
    http://lishi.tianqi.com/beijing/201603.html
    http://lishi.tianqi.com/beijing/201602.html
    '''
    link_list = []
    bs = BeautifulSoup(html_text, "html.parser")
    div = bs.find_all('div', {'id': 'tool_site'})
    link = div[4].find_all('a')
    for x in link:
        link_list.append(x.get("href"))
        print x.get("href"), x.string
    return link_list

def get_data(html_text):
    '''
    得到每天的数据
    bs.find('div', {'class': 'tqtongji2'})
    '''
    result = []
    bs = BeautifulSoup(html_text, "html.parser")

    content = bs.find('div', {'class': 'tqtongji2'})
    ul = content.find_all("ul")
    for x in ul:
        if x != ul[0]:
            temp = []
            data = x.find_all("li")
            date = data[0].string
            high = data[1].string
            low = data[2].string
            weather = data[3].string
            wind_direction = data[4].string
            '''
            输出到.txt文件中时发现出现格式错误,
            原因是wind_direction为空,
            '''
            if wind_direction is None:
                wind_direction = "Null"
            wind_force = data[5].string

            temp.append(date)
            temp.append(high)
            temp.append(low)
            temp.append(weather)
            temp.append(wind_direction)
            temp.append(wind_force)
            result.append(temp)
    return result

def write_data(data, name):
    '''
    写入到csv文件中
    如果想输出到指定位置
    url = 'C:\\Users\\Administrator\\Desktop\\'
    with open(url + name, "ab") as f:
        写入到桌面
    '''
    with open(name, "ab") as f:
        f_csv = csv.writer(f)
        f_csv.writerows(data)


def write_data_text(data, name):
    '''
    写入到txt文件中
    '''
    for x in data:
        for i in x:
            if i is None:
                i = "Null"
            fw = open(name, "a")
            fw.write(i + "\t")
        fw.write("\n")
    fw.close()


url = "http://lishi.tianqi.com/beijing/index.html"

'''
程序运行的开始时间
'''
start_time = datetime.datetime.now()
print start_time

'''
得到html内容
'''
content = get_content(url, my_headers)

'''
得到每年月份的链接
'''
link = get_link(content)

'''
循环每年月日的链接得到数据,并写入到文件中
'''
for x in link:
    html_text = get_content(x, my_headers)
    data = get_data(html_text)
    file_name = "weather.csv"   #保存的文件名
    write_data(data, file_name)

'''
程序的结束时间
'''
endtime = datetime.datetime.now()
print endtime

'''
程序的总运行时间(秒)
'''
print (endtime - start_time).seconds

csv文件中的格式

这里写图片描述

txt文件中的格式

这里写图片描述


Python中的文件打开模式的含义

模式mode含义说明
r只读不可写如果未指定mode,默认为此模式打开文件
w只写如果用’w’,会把原先已存在的内容擦除
a附加,追加写数据时,会自动添加到已存文件的末尾

Windows平台:

支持在mode后面添加’b’,表示以 二进制 模式打开文件;
所以对应的mode就有
  rb
  wb
  r+b
Python在Windows中,是区分 二进制 和 文本 文件的。
    当对文件进行数据读写时,行尾(end-of-line)符,会自动发生轻微的变化此种变化,对于文本文件,是没问题的,但是对于 二进制 文件,则很明显,会改变(破坏)原有的数据,即,是有问题的。所以,当你在用Python操作Windows下面的文件的时候,要自己很清楚自己操作的是什么类型的文件,即,是 文本text 还是 二进制binary 文件

Unix平台:

  Linux平台对于b’,是不影响的换句话说:如果你是用Python操作 二进制文件,则可以通过 加上’b’,得以实现,平台相关的效果,即 既适用于Windows平台,也适用于Unix类的平台。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值