allitebooks書(shū)本信息爬取

一. allitebooks網(wǎng)站鏈接:http://www.allitebooks.com/

二. 具體流程

  1. allitebooks的網(wǎng)頁(yè)以翻頁(yè)的形式展現(xiàn)下一頁(yè)的書(shū)籍信息贷币,通過(guò)對(duì)鏈接的比較,發(fā)現(xiàn)url的規(guī)律:"http://www.allitebooks.com/page/{}/".format(index)啄糙,其中index表示頁(yè)碼放刨,可以根據(jù)這個(gè)規(guī)則決定爬取多個(gè)網(wǎng)頁(yè)的數(shù)據(jù)工秩;

  2. 根據(jù)url去請(qǐng)求網(wǎng)頁(yè)數(shù)據(jù),并返回指定編碼‘utf-8’的網(wǎng)頁(yè)數(shù)據(jù)进统,用戶(hù)下一步的網(wǎng)頁(yè)數(shù)據(jù)的解析助币;

  3. 對(duì)網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行解析,本文用xpath和beautifulsoup的方法都實(shí)現(xiàn)了螟碎,獲取的信息有書(shū)名眉菱、作者、書(shū)詳情鏈接掉分、簡(jiǎn)介俭缓,保存到一個(gè)list中,用于后續(xù)的數(shù)據(jù)保存酥郭;


    網(wǎng)頁(yè)解析
  4. 將解析完成的數(shù)據(jù)保存到csv中华坦。

  5. 代碼如下:

# -*- coding: utf-8 -*-

import requests
from lxml import etree
import csv
from bs4 import BeautifulSoup
import time

class BookSpider(object):
    def __init__(self):
        # 初始化數(shù)據(jù),請(qǐng)求的url,headers和保存最終結(jié)果的result變量
        # 頁(yè)面是翻頁(yè)加載數(shù)據(jù)的不从,翻頁(yè)的鏈接規(guī)則是www.allitebooks.com/page/n/  ,其中n表示第n頁(yè)的數(shù)據(jù)
        self.url = "http://www.allitebooks.com/page/{}/"
        self.headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
        # 需要爬取的信息有書(shū)名book_name惜姐,作者author,書(shū)的詳情鏈接url和書(shū)的簡(jiǎn)介summary
        self.result = [['book_name', 'author', 'url', 'summary']]

    # 獲取需要請(qǐng)求的url椿息,返回一個(gè)List的url去請(qǐng)求相關(guān)頁(yè)面的數(shù)據(jù)
    def get_url_list(self):
        url_list = []
        for index in range(1,8):
            url_list.append((self.url).format(index))
        return url_list

    # 根據(jù)給到的url去請(qǐng)求相關(guān)頁(yè)面的數(shù)據(jù)
    def get_data(self, url):
        response = requests.get(url=url, headers=self.headers)
        return response.content.decode('utf-8')

    # 使用xpath對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行解析
    def parse_data_xpath(self, data):
        xpath_data = etree.HTML(data)
        # 獲取包含了書(shū)名歹袁、作者、鏈接寝优、簡(jiǎn)介的模塊列表宇攻,對(duì)列表進(jìn)行遍歷,獲取相關(guān)的信息
        articles = xpath_data.xpath('//div[@class="entry-body"]')
        for article in articles:
            article_list = []
            # 獲取書(shū)名
            book_name = article.xpath('.//h2/a/text()')[0]
            # 獲取作者
            author = article.xpath('.//h5[@class="entry-author"]/a/text()')[0]
            # 獲取書(shū)的詳情鏈接
            url = article.xpath('.//h2/a/@href')[0]
            # 獲取書(shū)的簡(jiǎn)介
            summary = article.xpath('./div[@class="entry-summary"]/p/text()')[0]
            # 組合成一個(gè)list倡勇,添加到成員變量result中逞刷,用于最后的csv保存
            article_list = [book_name, author, url, summary]
            self.result.append(article_list)

    # 使用BeautifulSoup對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行解析
    def parse_data_bs4(self, data):
        bs4_data = BeautifulSoup(data, 'lxml')
        # 獲取包含了書(shū)名、作者妻熊、鏈接夸浅、簡(jiǎn)介的模塊列表,對(duì)列表進(jìn)行遍歷扔役,獲取相關(guān)的信息
        articles = bs4_data.select('.entry-body')
        for article in articles:
            article_list=[]
            book_name = article.select('.entry-title a')[0].get_text()
            author = article.select('.entry-author a')[0].get_text()
            url = article.select('.entry-title a')[0].get('href')
            summary = article.select('.entry-summary p')[0].get_text()
            article_list = [book_name, author, url, summary]
            self.result.append(article_list)
        print(len(self.result))

    # 使用csv的方式保存result中的數(shù)據(jù)
    def save_data(self):
        # 需要指定encoding='utf-8',不然會(huì)有編碼報(bào)錯(cuò)(windows專(zhuān)屬哈哈)
        # 因?yàn)槭鞘褂玫膒ython3版本帆喇,所以需要newline='',不指定的話(huà)保存的csv中,每行后面都會(huì)有個(gè)空行
        book_fp = open("book_info.csv", 'w', newline='', encoding='utf-8')
        writer = csv.writer(book_fp)
        writer.writerows(self.result)

        book_fp.close()
        
    # 執(zhí)行數(shù)據(jù)爬取和保存的操作:獲取需要爬取的網(wǎng)頁(yè)的鏈接-->根據(jù)鏈接獲取網(wǎng)頁(yè)數(shù)據(jù)-->對(duì)網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行解析-->保存解析后的數(shù)據(jù)
    def run(self):
        # 獲取需要爬去數(shù)據(jù)的url
        url_list = self.get_url_list()
        for url in url_list:
            # 獲取網(wǎng)頁(yè)數(shù)據(jù)
            data = self.get_data(url)
            # 對(duì)網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行解析亿胸,可以使用xpath的parse_data_xpath()或者BeautifulSoup的parse_data_bs4進(jìn)行解析坯钦,獲取相關(guān)數(shù)據(jù)
            self.parse_data_bs4(data)
            # 休眠1秒
            time.sleep(1)
        # 保存爬去的數(shù)據(jù)
        self.save_data()

BookSpider().run()

結(jié)果:


實(shí)驗(yàn)結(jié)果

三.遇到的問(wèn)題

  1. 保存的csv文件中多了一行空行


    保存的csv文件中多了一行空行

在windows這種使用\r\n的系統(tǒng)里预皇,不用newline=‘’的話(huà),會(huì)自動(dòng)在行尾多添加個(gè)\r婉刀,導(dǎo)致多出一個(gè)空行吟温,即行尾為\r\r\n
參考鏈接:https://blog.csdn.net/pfm685757/article/details/47806469

解決方法:在打開(kāi)的文件流中添加newline='',如:book_fp = open("book_info.csv", 'w', newline='', encoding='utf-8')

  1. 保存數(shù)據(jù)到csv時(shí)遇到UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 444: illegal multibyte sequence的報(bào)錯(cuò)

在window平臺(tái)突颊,文件的默認(rèn)編碼是gbk鲁豪, 此時(shí)如果寫(xiě)入的字符串的編碼是utf-8,則會(huì)引發(fā)編碼報(bào)錯(cuò)
參考鏈接:http://www.itdaan.com/blog/2018/04/19/cef6ddb3809354ac175c64c228fe51fb.html

解決方法:指定編碼格式encoding='utf-8'的情況下打開(kāi)寫(xiě)入流:book_fp = open("book_info.csv", 'w', newline='', encoding='utf-8')

  1. summary的文本數(shù)據(jù)過(guò)長(zhǎng)律秃,通過(guò)Excel 打開(kāi)csv的時(shí)候爬橡,數(shù)據(jù)顯示在一個(gè)單元格上
    數(shù)據(jù)顯示在一個(gè)單元格上

    參考鏈接:https://blog.csdn.net/caolaosanahnu/article/details/7351776
    解決方法:目前來(lái)看應(yīng)該是excel打開(kāi)csv時(shí)會(huì)有的格式的問(wèn)題,暫時(shí)不是很清楚為什么會(huì)出現(xiàn)這個(gè)問(wèn)題棒动,但是將csv文件用記事本的方式打開(kāi)之后糙申,另存為時(shí)選擇utf-8的編碼格式,再打開(kāi)另存為的文件船惨,是可以看到整齊的數(shù)據(jù)的郭宝。

代碼鏈接:https://github.com/zhuyecao/kaikeba/tree/master/kaikeba/allitebook

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掷漱,隨后出現(xiàn)的幾起案子粘室,更是在濱河造成了極大的恐慌,老刑警劉巖卜范,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衔统,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡海雪,警方通過(guò)查閱死者的電腦和手機(jī)锦爵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奥裸,“玉大人险掀,你說(shuō)我怎么就攤上這事⊥逯妫” “怎么了樟氢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侠鳄。 經(jīng)常有香客問(wèn)我埠啃,道長(zhǎng),這世上最難降的妖魔是什么伟恶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任碴开,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潦牛。我一直安慰自己眶掌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布巴碗。 她就那樣靜靜地躺著朴爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪良价。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天蒿叠,我揣著相機(jī)與錄音明垢,去河邊找鬼。 笑死市咽,一個(gè)胖子當(dāng)著我的面吹牛痊银,可吹牛的內(nèi)容都是我干的奋渔。 我是一名探鬼主播载萌,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膳殷!你這毒婦竟也來(lái)了谷醉?” 一聲冷哼從身側(cè)響起致稀,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俱尼,沒(méi)想到半個(gè)月后抖单,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遇八,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年矛绘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃永。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡货矮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斯够,到底是詐尸還是另有隱情囚玫,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布读规,位于F島的核電站劫灶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掖桦。R本人自食惡果不足惜本昏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枪汪。 院中可真熱鬧涌穆,春花似錦怔昨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祝沸,卻和暖如春矮烹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罩锐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工奉狈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涩惑。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓仁期,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親竭恬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跛蛋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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