【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 | 附加,追加 | 写数据时,会自动添加到已存文件的末尾 |
支持在mode后面添加’b’,表示以 二进制 模式打开文件;
所以对应的mode就有
rb
wb
r+b
Python在Windows中,是区分 二进制 和 文本 文件的。
当对文件进行数据读写时,行尾(end-of-line)符,会自动发生轻微的变化此种变化,对于文本文件,是没问题的,但是对于 二进制 文件,则很明显,会改变(破坏)原有的数据,即,是有问题的。所以,当你在用Python操作Windows下面的文件的时候,要自己很清楚自己操作的是什么类型的文件,即,是 文本text 还是 二进制binary 文件
Unix平台:
Linux平台对于b’,是不影响的换句话说:如果你是用Python操作 二进制文件,则可以通过 加上’b’,得以实现,平台相关的效果,即 既适用于Windows平台,也适用于Unix类的平台。
相关文章推荐
- Python数据抓取(2) —简单网络爬虫的撰写
- 最近用htmlunit做网络爬虫 遇到拿不到初始化js加载的数据的问题 最近解决了 写个简单的例子
- 编写简单的网络爬虫 (python3.2)
- [Python学习] 简单网络爬虫抓取博客文章及思想介绍
- 使用Python编写简单网络爬虫抓取视频下载资源
- 使用python语言结合beautifulsoup编写简单的网络爬虫
- Python 网络爬虫5 ---- 第一次实现抓取数据并且存放到mysql数据库中
- [python]简单的网络爬虫
- 【python网络编程】新浪爬虫:关键词搜索爬取微博数据
- python 实现简单网络爬虫
- Python爬虫扒取2345天气预报网上的邯郸天气数据
- 大数据之网络爬虫-一个简单的多线程爬虫
- python简单网络爬虫程序
- 在python3中使用urllib.request编写简单的网络爬虫
- Python与简单网络爬虫的编写
- 用Python进行网络爬虫和数据分析的初次尝试(一)
- 使用Python编写简单网络爬虫抓取视频下载资源
- 使用Python编写简单网络爬虫抓取视频下载资源
- Python简单爬虫(爬取天气信息)
- python 简单的网络爬虫 + html 正文抽取