[python爬虫] BeautifulSoup爬取+CSV存储贵州农产品数据

在学习使用正则表达式、BeautifulSoup技术或Selenium技术爬取网络数据过程中,通常会将爬取的数据存储至TXT文件中,前面也讲述过海量数据存储至本地MySQL数据库中,这里主要补充BeautifulSoup爬取贵州农产品数据的过程,并存储至本地的CSV文件。

核心内容包括以下几点:
    1.如何调用BeautifulSoup爬取网页数据。
    2.如何存储数据至CSV文件。
    3.如何解决中文字符存储的乱码问题,UTF8编码设置。
    4.如何定时设置爬取任务,定时截图保存。

基础文章希望对大家有所帮助,尤其是刚入门学习BeautifulSoup爬虫知识,或者是遇到如何将中文数据存储至CSV文件下的同学。如果文章中存在错误或不足之处,还请海涵~



一. Python操作CSV库

CSV(Comma-Separated Values)是常用的存储文件,逗号分隔符,值与值之间用分号分隔。Python中导入CSV扩展包即可使用,包括写入文件和读取文件。

1.写入CSV文件

# -*- coding: utf-8 -*-
import csv
c = open("test-01.csv", "wb")  #写文件
writer = csv.writer(c)
writer.writerow(['序号','姓名','年龄'])

tlist = []
tlist.append("1")
tlist.append("小明")
tlist.append("10")
writer.writerow(tlist)
print tlist,type(tlist)

del tlist[:]  #清空
tlist.append("2")
tlist.append("小红")
tlist.append("9")
writer.writerow(tlist)
print tlist,type(tlist)

c.close()
其中writerow用于写文件,这里增加列表list写入。输出如下图所示:


2.读取CSV文件

# -*- coding: utf-8 -*-
import csv
c = open("test-01.csv", "rb")  #读文件
reader = csv.reader(c)
for line in reader:
    print line[0],line[1],line[2]
c.close()
输出结果如下:
序号 姓名 年龄
1 小明 10
2 小红 9



二. BeautifulSoup爬取贵州农经网

打开贵州农经网可以看到每天各类农产品的价格及产地更新数据,如下图所示。
网址:http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1


现在需要通过BeautifulSoup获取 产品、价格、单位、产地和发布时间五个信息,通过浏览器“审查元素”可以看到每行数据都位于<tr>节点下,其class属性为“odd gradeX”,调用find_all函数即可获取。


爬取第一页的代码如下:

# -*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup

i = 1
while i<5:
    print "爬取第" + str(i) + "页"
    url = "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=" + str(i)
    print url
    content = urllib.urlopen(url).read()
    soup = BeautifulSoup(content, "html.parser")
    print soup.title.get_text()
    
    num = soup.find_all("tr",class_="odd gradeX")
    for n in num:
        con = n.get_text()        
        num = con.splitlines()
        print num[1],num[2],num[3],num[4],num[5]
        
    i = i + 1
注意以下几点:
    1.由于网页涉及到翻页,通过分析URL发现,与"page=xxx"相关,则定义循环爬取1-5页的内容;
    2.BeautifulSoup相当于将爬取的网页解析成树状结构,调用soup.title可以得到<title>xxxx</title>内容,再调用get_text()函数获取值;
    3.核心代码是通过num = soup.find_all("tr",class_="odd gradeX")找到内容;
    4.通过splitlines()删除换行,并生成序列,再依次获取内容num[n]。
输出如下所示:

爬取第1页
http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1
贵州农经网
龙虾 260 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
豌豆 8 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
泥鳅 40 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
...
爬取第2页
http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=2
贵州农经网
石斑鱼 60 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
紫菜(干) 34 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
纽荷尔 14 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
黄鳝 70 元/公斤 贵阳市南明区新路口集贸市场 2017-10-30 11:28:39
...
接下来需要将内容存储至CSV文件中,这里最容易出现的错误是中文乱码的问题。一方面,需要将创建的CSV文件设置为UTF-8编码,另一方面需要调用encode('utf-8')函数转化为中文编码方式,写入文件。代码如下:
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 20 20:07:36 2017

@author: eastmount CSDN 杨秀璋
"""

import urllib
from bs4 import BeautifulSoup
import csv
import codecs

c = open("test.csv","wb")    #创建文件
c.write(codecs.BOM_UTF8)     #防止乱码
writer = csv.writer(c)       #写入对象
writer.writerow(['产品','价格','单位','批发地','时间'])

i = 1
while i <= 4:
    print "爬取第" + str(i) + "页"
    url = "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=" + str(i)
    content = urllib.urlopen(url).read()
    soup = BeautifulSoup(content,"html.parser")
    print soup.title.get_text()
    tt = soup.find_all("tr",class_="odd gradeX")
    for t in tt:
        content = t.get_text()
        num = content.splitlines()
        print num[0],num[1],num[2],num[3],num[4],num[5]
        #写入文件
        templist = []
        num[1] =  num[1].encode('utf-8')
        num[2] =  num[2].encode('utf-8')        
        num[3] =  num[3].encode('utf-8')
        num[4] =  num[4].encode('utf-8')
        num[5] =  num[5].encode('utf-8')
        templist.append(num[1])
        templist.append(num[2])
        templist.append(num[3])
        templist.append(num[4])
        templist.append(num[5])
        #print templist
        writer.writerow(templist)
    i = i + 1

c.close()
输出如下所示,写入CSV文件下载前4页内容。


如果在增加一个定时机制,每天定时爬取就非常完美了。最后补充一下Anaconda制作的定时任务。


三. Python设置定时任务截图

通常可以使用系统的任务来实现,比如WPS、QQ等软件自动更新,或定时提醒,这里只需要每天定时执行爬虫代码即可,后面讲写一篇文章详细介绍。
参考:http://blog.csdn.net/wwy11/article/details/51100432

下面是每隔10秒钟打开网页,然后进行截屏的操作。作为在线备份的代码,仅供参考。

# -*- coding:utf-8 -*-
from PIL import ImageGrab
import webbrowser as web
import time
import os

#定时15分钟
def sleeptime(hour,min,sec):
    return hour*3600 + min*60 + sec

second = sleeptime(0,0,10)
j = 1
while j==1:
    time.sleep(second)
    #打开网页
    url = ["https://www.gzzzb.gov.cn/","http://www.gznw.gov.cn/"]
    i = 1
    while i<=len(url):
        web.open_new_tab(url[i-1])
        time.sleep(5)
        im = ImageGrab.grab()
        im.save(str(j)+'.jpg','JPEG')#图片保存
        i = i+1
        j = j+1


《勿忘心安》
勿要把酒倚寒窗,庭院枯叶已飞霜。
忘怀之前坎坷路,劝君一醉付流光。
心中愁苦漫翻滚,雪上寒鸦入画堂。
安知我辈庸庸过,双鬓飞白亦疏狂。

很喜欢这首诗,也享受在公交车上备课的日子,心很静很安,更享受和期待新装修的新家,人生漫漫,还是带着一丝微笑和她前行。接下来再忙还是挤点时间看看分布式爬虫和深度学习,十月这个节点终于结束啦。学生的笔记不错,有我的风范,大家也很认真。
Remember you are born to live. Don’t live because you are born! Don't go the way life takes you.Take life the way you go! Follow my heart and nana's footsteps forever.

最后希望这篇文章对你有所帮助。
(By:Eastmount 2017-10-30  18:00 http://blog.csdn.net/eastmount/)



  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Python爬虫是一种通过编写Python程序来自动化获取互联网上的数据的技术。爬虫可以用于从网上抓取各种数据,包括文字、图片、视频等。而网课数据爬取是指使用爬虫技术从网上抓取各种网课相关的数据,比如课程名称、课程价格、课程评分等。 爬取网课数据的过程通常分为以下几个步骤: 1. 确定要爬取的目标网站和数据,比如某个网上教育平台的课程页面。 2. 使用Python爬虫库,比如Requests库或Scrapy框架,发送HTTP请求获取网页内容。 3. 使用解析库,比如BeautifulSoup库或XPath,解析网页内容,提取所需的数据。 4. 对数据进行清洗和处理,比如去除HTML标签、缺失值处理等。 5. 将清洗过的数据保存到本地文件数据库中,以备后续分析和可视化使用。 在获取到网课数据后,可以使用可视化工具,比如Matplotlib库或Plotly库,来进行数据的可视化展示。通过可视化,可以更直观地理解和分析数据,并将数据以图表的形式展示出来,比如柱状图、折线图、饼图等。这些图表可以帮助人们更好地理解网课的分布、趋势和关联性,为决策提供参考。 总而言之,Python爬虫技术可以用于网课数据爬取,而数据的可视化则可以通过使用Python的可视化库来实现。这种方式可以帮助我们更好地利用网上的网课资源,并通过数据分析和可视化来获得更多的洞见和价值。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值