人生第一個(gè)python爬蟲小程序

程序的主要功能就是獲取一個(gè)天氣網(wǎng)站的數(shù)據(jù)然后存儲(chǔ)在一個(gè)cvs文件

環(huán)境為2.7 需要用到的庫

import requests
import csv
import random
from bs4 import BeautifulSoup

requests 網(wǎng)絡(luò)請求需要自行安裝
csv python自帶的操作文件的庫
random 隨機(jī)數(shù) 模擬真實(shí)請求的timeout
Beaautifulsoup 代替正則表達(dá)式的神器 幫助我們更好獲取html中需要的內(nèi)容

主要業(yè)務(wù)分為三步:
1.獲取當(dāng)前網(wǎng)頁內(nèi)容
2.解析網(wǎng)頁獲取目標(biāo)數(shù)據(jù)內(nèi)容
3.寫入csv文件中

代碼如下

#獲取網(wǎng)頁內(nèi)容
def get_content(url, data = None):
    header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
    }
    timeout = random.choice(range(80, 180))
    rep = requests.get(url, headers=header, timeout=timeout)
    rep.encoding = 'utf-8'
    return rep.text

#解析網(wǎng)頁 返回目標(biāo)數(shù)據(jù)
def get_data(html_text):
    final = []
    bs = BeautifulSoup(html_text, "html.parser")  # 創(chuàng)建BeautifulSoup對象
    body = bs.body # 獲取body部分
    data = body.find('div', {'id': '7d'})  # 找到id為7d的div
    ul = data.find('ul')  # 獲取ul部分
    li = ul.find_all('li')  # 獲取所有的li
    for day in li: # 對每個(gè)li標(biāo)簽中的內(nèi)容進(jìn)行遍歷
        temp = []
        date = day.find('h1').string  # 找到日期
        temp.append(date)  # 添加到temp中
        inf = day.find_all('p')  # 找到li中的所有p標(biāo)簽
        temp.append(inf[0].string,)  # 第一個(gè)p標(biāo)簽中的內(nèi)容(天氣狀況)加到temp中
        if inf[1].find('span') is None:
            temperature_highest = None # 天氣預(yù)報(bào)可能沒有當(dāng)天的最高氣溫(到了傍晚梳庆,就是這樣)兔魂,需要加個(gè)判斷語句,來輸出最低氣溫
        else:
            temperature_highest = inf[1].find('span').string  # 找到最高溫
            temperature_highest = temperature_highest.replace('', '')  # 到了晚上網(wǎng)站會(huì)變烘嘱,最高溫度后面也有個(gè)℃
        temperature_lowest = inf[1].find('i').string  # 找到最低溫
        temperature_lowest = temperature_lowest.replace('', '')  # 最低溫度后面有個(gè)℃,去掉這個(gè)符號
        temp.append(temperature_highest)   # 將最高溫添加到temp中
        temp.append(temperature_lowest)   #將最低溫添加到temp中
        final.append(temp)   #將temp加到final中

    return final

#寫入文件
def write_data(data, name):
    file_name = name
    with open(file_name, 'w+r') as f:
        myCsv = UnicodeWriter(f)
        myCsv.writerow(f)
        myCsv.writerows([[u'日期', u'天氣', u'最高溫度', u'最低溫度']])
        myCsv.writerows(data)

涉及到unicode字符內(nèi)容導(dǎo)致數(shù)據(jù)寫不進(jìn)去,我查閱資料發(fā)現(xiàn)官方給出了一個(gè)解決辦法-----重寫csv類

import csv, codecs, cStringIO

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
    """

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
        # Redirect output to a queue
        self.queue = cStringIO.StringIO()
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()

    def writerow(self, row):
        self.writer.writerow([s.encode("utf-8") for s in row])
        # Fetch UTF-8 output from the queue ...
        data = self.queue.getvalue()
        data = data.decode("utf-8")
        # ... and reencode it into the target encoding
        data = self.encoder.encode(data)
        # write to the target stream
        self.stream.write(data)
        # empty queue
        self.queue.truncate(0)

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

最后的代碼

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import random
from bs4 import BeautifulSoup


import csv, codecs, cStringIO

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
    """

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
        # Redirect output to a queue
        self.queue = cStringIO.StringIO()
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()

    def writerow(self, row):
        self.writer.writerow([s.encode("utf-8") for s in row])
        # Fetch UTF-8 output from the queue ...
        data = self.queue.getvalue()
        data = data.decode("utf-8")
        # ... and reencode it into the target encoding
        data = self.encoder.encode(data)
        # write to the target stream
        self.stream.write(data)
        # empty queue
        self.queue.truncate(0)

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

def write_data(data, name):
    file_name = name
    with open(file_name, 'w+r') as f:
        myCsv = UnicodeWriter(f)
        myCsv.writerow(f)
        myCsv.writerows([[u'日期', u'天氣', u'最高溫度', u'最低溫度']])
        myCsv.writerows(data)



def get_content(url, data = None):
    header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
    }
    timeout = random.choice(range(80, 180))
    rep = requests.get(url, headers=header, timeout=timeout)
    rep.encoding = 'utf-8'
    return rep.text

def get_data(html_text):
    final = []
    bs = BeautifulSoup(html_text, "html.parser")  # 創(chuàng)建BeautifulSoup對象
    body = bs.body # 獲取body部分
    data = body.find('div', {'id': '7d'})  # 找到id為7d的div
    ul = data.find('ul')  # 獲取ul部分
    li = ul.find_all('li')  # 獲取所有的li
    for day in li: # 對每個(gè)li標(biāo)簽中的內(nèi)容進(jìn)行遍歷
        temp = []
        date = day.find('h1').string  # 找到日期
        temp.append(date)  # 添加到temp中
        inf = day.find_all('p')  # 找到li中的所有p標(biāo)簽
        temp.append(inf[0].string,)  # 第一個(gè)p標(biāo)簽中的內(nèi)容(天氣狀況)加到temp中
        if inf[1].find('span') is None:
            temperature_highest = None # 天氣預(yù)報(bào)可能沒有當(dāng)天的最高氣溫(到了傍晚饥脑,就是這樣)阿蝶,需要加個(gè)判斷語句,來輸出最低氣溫
        else:
            temperature_highest = inf[1].find('span').string  # 找到最高溫
            temperature_highest = temperature_highest.replace('', '')  # 到了晚上網(wǎng)站會(huì)變,最高溫度后面也有個(gè)℃
        temperature_lowest = inf[1].find('i').string  # 找到最低溫
        temperature_lowest = temperature_lowest.replace('', '')  # 最低溫度后面有個(gè)℃柬甥,去掉這個(gè)符號
        temp.append(temperature_highest)   # 將最高溫添加到temp中
        temp.append(temperature_lowest)   #將最低溫添加到temp中
        final.append(temp)   #將temp加到final中

    return final



if __name__ == '__main__':
    url ='http://www.weather.com.cn/weather/101190401.shtml'
    html = get_content(url)
    result = get_data(html)
    print(result)
    write_data(result, 'weather.csv')

然后


image.png

困惑:
程序中對字符不知道怎么處理饮六,會(huì)報(bào)錯(cuò)UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)希望大牛指點(diǎn)迷津,感激不盡

參考鏈接https://blog.csdn.net/Bo_wen_/article/details/50868339

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暗甥,一起剝皮案震驚了整個(gè)濱河市喜滨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撤防,老刑警劉巖虽风,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡辜膝,警方通過查閱死者的電腦和手機(jī)无牵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厂抖,“玉大人茎毁,你說我怎么就攤上這事〕栏ǎ” “怎么了七蜘?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墙懂。 經(jīng)常有香客問我橡卤,道長,這世上最難降的妖魔是什么损搬? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任碧库,我火速辦了婚禮,結(jié)果婚禮上巧勤,老公的妹妹穿的比我還像新娘嵌灰。我一直安慰自己,他們只是感情好颅悉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布沽瞭。 她就那樣靜靜地躺著,像睡著了一般签舞。 火紅的嫁衣襯著肌膚如雪秕脓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天儒搭,我揣著相機(jī)與錄音吠架,去河邊找鬼。 笑死搂鲫,一個(gè)胖子當(dāng)著我的面吹牛傍药,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魂仍,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拐辽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擦酌?” 一聲冷哼從身側(cè)響起俱诸,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赊舶,沒想到半個(gè)月后睁搭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赶诊,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年园骆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舔痪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锌唾,死狀恐怖锄码,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晌涕,我是刑警寧澤滋捶,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站渐排,受9級特大地震影響炬太,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驯耻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炒考。 院中可真熱鬧可缚,春花似錦、人聲如沸斋枢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓤帚。三九已至描姚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戈次,已是汗流浹背轩勘。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怯邪,地道東北人绊寻。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悬秉,于是被迫代替她去往敵國和親澄步。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容