使用Python和BeautifulSoup爬取历史上的今天网站并将描述及网址存储到csv文件中
2017-09-30 10:24
896 查看
Python版本:python3.6.0 | Anocanda 4.3.1 (64-bit)
BeautifulSoup版本:4.0.0.1
使用的python库:csv,bs4, os, urllib.request
爬取网站:历史上的今天(http://www.lssdjt.com/2/29/)
简述:历史上的今天网站,网页源码比较规整,便于进行爬取,将爬虫的基本知识融合在一起进行使用,作为自己python学习之路的小小记录。
备注:在进行代码爬取的过程中,需要有个初始化的日期,初始化日期如上所示,之所以选择2月29号,是因为,爬取的年份不是闰年,不从2月29号开始,会漏掉2月29号这一天。
爬取的结果(共一万多条数据):
1、导入所需要的python库
urlopen:用于打开网页
BeautifulSoup:在进行网页中元素查找时,有了BeautifulSoup这种将页面结构化的工具,会方便很多
csv:用于将数据写入csv文件
os:用于获取文件的路径
2、初始化将要进行写入的csv文件:
网页显示如图所示:
在网页上点击右键(本例使用的是Chrome浏览器),在弹出的菜单中选择检查。(或者按Ctrl + Shift + I)
如图所示:
通过对网页的分析可知,我们需要的内容及内容对应的网址,在"class"为"main"的<div>元素中,<div>元素下有个<ul>元素,类为"clear fix"
我们需要后一天的日期来进行下一步的爬取,在页面中有后一天的位置,再次对后一天按钮进行检查,可以得到:
使用BeautifulSoup中的find及findAll函数,可以得到历史上的今天内容及内容相对应的网址,同时返回下一步要进行爬取的链接地址:
def WriteItems(url):
html = urlopen(url)
bsObj = BeautifulSoup(html, 'lxml')
nextUrlClass = bsObj.find('ul', {'class': 'bot'}).find('li', {'class': 'r'})
next_url = nextUrlClass.a['href']
print(next_url)
page_items = bsObj.find('div', {'class': 'main'}).find('ul', {'class': 'list clearfix'})
items = page_items.findAll('li', {'class': 'gong'})
return next_url, items
4、爬取完成后,将items写入到csv文件中:
def WriteToCSV(items, date):
# dateSplit = date.split('/')
# dateDir = dateSplit[0] + ' ' + dateSplit[1]
# os.mkdir(os.getcwd() + "/files/images/" + dateDir)
writer = csv.writer(csvFile, delimiter=' ')
writer.writerow(date)
writer = csv.writer(csvFile)
for item in items:
# try:
# imgUrl = item.a["rel"]
# imgName = item.a['title']
# urlretrieve(imgUrl[0], os.getcwd() + "/files/images/" + dateDir + '/' + imgName + ".jpg")
# print(imgUrl[0])
# except:
# pass
try:
writer.writerow((item.a['title'], item.a['href']))
except:
pass(注:注释部分表示的是对存在的图片进行爬取,因为图片爬取不顺畅,故将其注释,但程序可跑,将图片爬取完毕后,可以做一个展示网站,当然这是自己的设想啦……)
使用try和except,以使程序能够在遇到错误时,不会挂掉
5、因为一年最多是有366天,所以用for循环进行爬取,爬取写入完毕后,将csv文件关闭:
for _ in range(366):
startUrlSplit = startUrl.split('/')
startUrl, items = WriteItems(startUrl)
date = startUrlSplit[-2] + '/' + startUrlSplit[-1]
WriteToCSV(items, date)
csvFile.close()所有可执行代码下载链接:http://download.csdn.net/download/zhangwellyear/10003634
BeautifulSoup版本:4.0.0.1
使用的python库:csv,bs4, os, urllib.request
爬取网站:历史上的今天(http://www.lssdjt.com/2/29/)
简述:历史上的今天网站,网页源码比较规整,便于进行爬取,将爬虫的基本知识融合在一起进行使用,作为自己python学习之路的小小记录。
备注:在进行代码爬取的过程中,需要有个初始化的日期,初始化日期如上所示,之所以选择2月29号,是因为,爬取的年份不是闰年,不从2月29号开始,会漏掉2月29号这一天。
爬取的结果(共一万多条数据):
1、导入所需要的python库
from urllib.request import urlopen from bs4 import BeautifulSoup import csv import os
urlopen:用于打开网页
BeautifulSoup:在进行网页中元素查找时,有了BeautifulSoup这种将页面结构化的工具,会方便很多
csv:用于将数据写入csv文件
os:用于获取文件的路径
2、初始化将要进行写入的csv文件:
# 初始化写入文件 csvFile = open(os.getcwd() + "/files/history.csv", 'w+', newline='') writer = csv.writer(csvFile) writer.writerow(('discription', 'url'))3、分析待爬取的网页,对网页进行爬取:
网页显示如图所示:
在网页上点击右键(本例使用的是Chrome浏览器),在弹出的菜单中选择检查。(或者按Ctrl + Shift + I)
如图所示:
通过对网页的分析可知,我们需要的内容及内容对应的网址,在"class"为"main"的<div>元素中,<div>元素下有个<ul>元素,类为"clear fix"
我们需要后一天的日期来进行下一步的爬取,在页面中有后一天的位置,再次对后一天按钮进行检查,可以得到:
使用BeautifulSoup中的find及findAll函数,可以得到历史上的今天内容及内容相对应的网址,同时返回下一步要进行爬取的链接地址:
def WriteItems(url):
html = urlopen(url)
bsObj = BeautifulSoup(html, 'lxml')
nextUrlClass = bsObj.find('ul', {'class': 'bot'}).find('li', {'class': 'r'})
next_url = nextUrlClass.a['href']
print(next_url)
page_items = bsObj.find('div', {'class': 'main'}).find('ul', {'class': 'list clearfix'})
items = page_items.findAll('li', {'class': 'gong'})
return next_url, items
4、爬取完成后,将items写入到csv文件中:
def WriteToCSV(items, date):
# dateSplit = date.split('/')
# dateDir = dateSplit[0] + ' ' + dateSplit[1]
# os.mkdir(os.getcwd() + "/files/images/" + dateDir)
writer = csv.writer(csvFile, delimiter=' ')
writer.writerow(date)
writer = csv.writer(csvFile)
for item in items:
# try:
# imgUrl = item.a["rel"]
# imgName = item.a['title']
# urlretrieve(imgUrl[0], os.getcwd() + "/files/images/" + dateDir + '/' + imgName + ".jpg")
# print(imgUrl[0])
# except:
# pass
try:
writer.writerow((item.a['title'], item.a['href']))
except:
pass(注:注释部分表示的是对存在的图片进行爬取,因为图片爬取不顺畅,故将其注释,但程序可跑,将图片爬取完毕后,可以做一个展示网站,当然这是自己的设想啦……)
使用try和except,以使程序能够在遇到错误时,不会挂掉
5、因为一年最多是有366天,所以用for循环进行爬取,爬取写入完毕后,将csv文件关闭:
for _ in range(366):
startUrlSplit = startUrl.split('/')
startUrl, items = WriteItems(startUrl)
date = startUrlSplit[-2] + '/' + startUrlSplit[-1]
WriteToCSV(items, date)
csvFile.close()所有可执行代码下载链接:http://download.csdn.net/download/zhangwellyear/10003634
相关文章推荐
- [python]通达信历史日线数据解析转换为CSV文件进行存储
- 用两种不同的方法导出ORACLE 查询数据为CSV 文件 (python 代码 与 使用 utl_file 包)
- android中使用csv文件来存储数据中遇到的几个问题
- 使用Python将csv文件批量化导入SQL Server
- 使用Python读取和写入CSV文件
- Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
- 【Python】类和对象、继承、使用文件、存储、异常、标准库(不懂)
- python3使用csv模块读写csv文件
- 使用python处理csv文件
- Python程序中用csv模块来操作csv文件的基本使用教程
- python使用writerows写csv文件产生多余空行
- 使用python读取csv文件,并将数据更新至mysql
- Python3使用csv模块csv.writer().writerow()保存csv文件,产生空行的问题
- python使用csv模块读写csv文件
- 使用python来访问Hadoop HDFS存储实现文件的操作
- 使用文件来存储属性 descr.py 描述符举例
- 基于腾讯COS对象存储SDK使用Python编写的文件上传工具第二版
- Python_使用csv模块解析csv文件
- 使用python处理中文csv文件,并让excel正确显示中文(避免乱码)
- [python]csv格式文件的使用