您的位置:首页 > 理论基础 > 计算机网络

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

2016-11-21 09:46 731 查看

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类的平台。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息