豆瓣讀書爬蟲(requests + re)

  前面整理了一些爬蟲的內容,今天寫一個小小的栗子,內容不深,大佬請忽略。內容包括對豆瓣讀書網站中的書籍的基本信息進行爬取,並整理,便於咱們快速瞭解每本書的中心。html

1、爬取信息

  每當爬取某個網頁的信息時,首先就是要進入到網頁中,看看有沒有什麼爬取過程當中的限制,能夠查看網站的robots協議。就是在原網址的後面加上"/robots.txt"。本網站中獲得的結果是:正則表達式

User-agent: *
Disallow: /subject_search
Disallow: /search
Disallow: /new_subject
Disallow: /service/iframe
Disallow: /j/
Sitemap: http://www.douban.com/sitemap_index.xml
Sitemap: http://www.douban.com/sitemap_updated_index.xml

User-agent: Wandoujia Spider
Disallow: /

  根據上面的協議能夠看到,並無禁止一些普通的爬蟲,就像咱們如今這樣,僅僅爬取一點點的東西來供本身使用。那麼,咱們就可使用以前文章中提到的結構來實現這個爬蟲,首先導入函數庫,而後套用框架,傳入地址,返回頁面內容。這點內容在這篇博客中寫到了,這裏就不詳細解釋了。到此,網頁的爬取就結束了,接下來就剩下從這些東西中拿到咱們想要的內容。express

 1 import requests  2 
 3 url = "https://book.douban.com/"
 4 def getHtmlText(url):  5     headers = {  6         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
 7  }  8     try:  9         response = requests.get(url, headers=headers) 10  response.raise_for_status() 11         response.encoding = response.apparent_encoding 12         return response.text 13     except: 14         print("Fail") 15         return
16     
17 html = getHtmlText(url)

2、信息處理

   上面提取的的網頁代碼包括不少東西,像展現出來的頁面的各類框架等等,這些對咱們來講都是沒有用的,並且經過正則來提取信息,若是在整個頁面中直接提取的話,難免會出現一些巧合,使得沒有提取到真正想要的內容,並且pattern同樣的其餘內容,因此,首先,把要把關鍵的塊先拿出來,再一點一點的取出具體信息。bash

1 import re 2 
3 re_books = re.compile('<ul class="list-col list-col5 list-express slide-item">(.*?)</ul>', re.S)  # re.S也在正則表達式的博客中寫到了,是爲了讓「.」能夠匹配換行符
4 content = re_books.search(html)

  經過檢查網頁源代碼,找到能夠取出主要信息的匹配規則,將中間的內容所有得到。剩下的就是經過正則來提取每本書的每項信息。這個在於本身觀察他們的規律,尋找匹配的規則。信息的標籤不止一個,最後選擇了使用pandas來整理數據,pandas的DataFrame數據類型能夠很方便的存儲二維結構,並且pandas有將數據之間存儲成excel格式的方法(DataFrame.to_excel())。app

 1 import pandas as pd  # 這是大部分人的習慣,pandas比較長,並且在數據處理中常常使用,因此用pd兩個字母來表明
 2 
 3 # 首先,先建立一個DataFrame,以後遍歷每本書籍的信息,存成DataFrame格式拼接在他的後面就能夠了
 4 data = pd.DataFrame(columns=['title', 'author', 'abstract', 'href', 'publisher'])  5 
 6 re_book = re.compile('<li class="">(.*?)</li>', re.S)  7 bookList = re_book.findall(content[0])  # findall找到全部的書籍信息,返回爲列表格式
 8 for book in bookList:  9     count = 0 10     count += 1
11     href = re.search('href="(.*?)"', book)  # .*? 是指以非貪婪的模式匹配,()是分組,經過group方便取出其中的信息
12     href = href.group(1) 13     title = re.search('<h4 class="title">(.*?)</h4>', book, re.S) 14     title = title.group(1).split()[0] 15     author = re.search('<span class="author">(.*?)</span>', book, re.S) 16     author = ' '.join(author.group(1).split()) 17     publisher = re.search('<span class="publisher">(.*?)</span>', book, re.S) 18     publisher = ' '.join(publisher.group(1).split()) 19     abstract = re.search('<p class="abstract">(.*?)</p>', book, re.S) 20     abstract = ' '.join(abstract.group(1).split()) 21     abstract = re.sub('【內容簡介】', '', abstract)  # 慢慢調試中發現,取得的信息不太好看,其中在第一本數的主要內容開頭有這麼幾個字,就用re的sub方法替換掉了
22     new = pd.DataFrame({"title":title, "author":author, "abstract":abstract, "href":href, "publisher":publisher}, index=["0"]) 23     data = data.append(new, ignore_index=True) 24 data.to_excel('bookInfo.xls', encoding='utf-8')

  咱們能夠看一下獲得的結果,pandas直接輸出的結果也很規整,這裏存儲到了excel中,起初存到csv文件中,可是亂碼了,後面沒多想就換成了excel,稍後我再去看看怎麼回事,或者有讀者清楚地,能夠教教博主。框架

  圖中有些東西沒有展現出來,可是你們都懂對吧。能夠本身試一試。固然這個爬蟲很淺,僅獲得這點的數據,後面的內容就交給大家了,能夠試着往深裏點一點,原理都是大同小異的,學習爬蟲在平時就要隨時發現能夠挖掘的東西,慢慢嘗試。ide

相關文章
相關標籤/搜索