1. 程式人生 > >小試牛刀 (抓取豆瓣推理小說資訊)

小試牛刀 (抓取豆瓣推理小說資訊)

1. 事前準備:

  • 瞭解scrapy的基本命令及弄懂scrapy文件中例子的專案結構等基本資訊
    下文將假設大家已經有了以上準備, 對一些細節不會詳細闡述, 如有不懂可以先翻翻文件或留言詢問
  • 下載本例子原始碼(文章末尾)

2. 豆瓣頁面分析

我們準備'下手'的是豆瓣推理小說的資料,截圖如下

小說資料
小說資料

目前(2015-4-16)豆瓣共有629頁的推理小說, 每頁有15本書,一共9000多本書
我們來用chrome審查元素功能看看

審查元素
審查元素

scrapy爬取的是html網頁原始碼,審查元素看的是經過js處理後的頁面,有些html頁是由js輸出的,有些會與html網頁原始碼不一樣,這裡豆瓣的書籍資訊不是經過js輸出的,所以可以放心這樣幹

稍加分析,並可以知道這些書都放在一個class='mod book-list'的div內,在這個div內分別用dl, dt這樣的標籤裝載書籍的資訊, 在寫爬蟲的時候我們可以直接用xpath,或css取出這些資訊的標籤.

3.開始寫爬蟲

首先執行兩個命令
scrapy startproject db_spider
在建立的目錄下,即xxx/db_pisder/下執行
scrapy genspider -t crawl douban douban.com
現在的專案目錄結構如下圖所示

專案目錄
專案目錄

關於scrapy的這幾個檔案是什麼意思我就不詳細介紹了,相信看過文件的人應該也有所瞭解。
接下來我們在items.py裡定義我們的資料物件

items項
items項

要抓取的東西如圖所示,按照從上到下,從左到右分別在items.py裡定義為如下欄位

items.png
items.png

接下來, 我們要在spiders/douban.py寫關於爬蟲的東西

DoubanSpider
DoubanSpider

這些配置的意思是,從http://www.douban.com/tag/推理/book?start=0 這個頁面開始, 遇到域名為douban.com且符合'start=\d+$'的連結則呼叫parse_item解析頁面並跟進這個連結查詢是否有符合規則的連結。
接下來我們要寫parse_item函式,在分析頁面的時候,我們已經確定要爬取哪些資訊。現在在parse_item裡寫的就是從頁面裡獲取這些資訊, 並存在items中。
我們可以先在db_spider目錄下執行scrapy shell http://www.douban.com/tag/推理/book?start=0


會得到一個用於除錯的命令列, 如下所示:

scrapy shell url
scrapy shell url

我們可以用view(response)在瀏覽器中開啟這個連結,這個連結看到的頁面就是爬蟲看到的頁面了,之前說過了,用js輸出的頁面跟爬蟲看到的頁面有時會不一樣,在爬取時可能看不到我們要的資訊,在爬複雜的網站時要注意。
然後我們可以在這個命令列內,對response進行xpath,css操作得到標籤,比如說我們要得到小說資料圖中的白夜叉這個書名,我們可以根據chrome的審查元素右鍵的copy xpath或copy css path功能得到標籤的路徑

copy xpath.png
copy xpath.png

我們得到的路徑可能是這樣的:

XPath
XPath

構造了一個之後,其它就簡單了, 這裡直接給出所有項的程式碼, 如果覺得xpath和css有困難的話,建議再看一下scrapy文件裡的例子及xpath和css的文件。

def parse_item(self, response):
    items = []
    book_list = response.css('div.mod.book-list dl')
    for book in book_list:
        item = DbSpiderItem()
        try:
            item['book_name'] = book.xpath('dd/a/text()').extract()[0]
            item['book_star'] = book.xpath('dd/div[1]/span[1]/@class').extract()[0][7:]
            item['book_rating'] = book.xpath('dd/div[1]/span[2]/text()').extract()[0]
            item['book_eval'] = book.xpath('dd/div[1]/span[3]/text()').extract()[0]
            desc = book.xpath('dd/div[2]/text()').extract()[0].strip().split('/')
            item['book_price'] = desc.pop()
            item['book_publish_date'] = desc.pop()
            item['book_publish'] = desc.pop()
            item['book_author'] = '/'.join(desc)
        except:
            pass
        items.append(item)
    return items

這裡注意一下程式碼裡的try,except塊, 這是為了豆瓣的書資料的特殊處理,因為豆瓣書的資料格式並不是全部都一致,有那麼幾本沒有出版社或者沒有出版日期,甚至沒有評分。如下圖,我們忽略這些個例就行了。

個例
個例

到此,我們的爬蟲就寫完了,我們還需要設定一下settings裡的DOWNLOAD_DELAY=2,這很重要,因為如果無間隔的去爬,很快會被豆瓣ban掉的。
一切準備完畢,我們可以試一下scrapy crawl douban -o book_data.json來爬取資料並轉化成json格式。
爬蟲孜孜不倦地開始爬資料了, 但我們要爬取的只有629頁, 630頁之後的書都沒有了,爬蟲卻停不下來。怎麼辦?除了用ctrl+c(兩次)強制停止外,我們可以在Rule裡面把正則式改成這樣

rule
rule

最多匹配到999頁了,如果還是覺得不爽,可以查查scrapy的CloseSpider異常,丟擲該異常可以暫停/停止爬蟲。

最終我們爬取的部分資料如下,

book_data.json
book_data.json

把json改成{'Record': [{book_data1,book_data2}]}的形式,可以用匯入工具(Navicat Premium)匯入資料庫中,當然,你也可以自己寫個插入語句放入資料庫。

4.總結

本篇文章到此結束, 其實也就相當於scrapy官方文件的例子的擴充套件,只是比那個例子更結合實際一點,沒有講什麼特別的東西,我們可以發現,用scrapy定製這個簡易爬蟲,其實不過100行的程式碼,還是十分的簡單易用的。



文/destino74(簡書作者)
原文連結:http://www.jianshu.com/p/fb012aadbc21
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關推薦

小試牛刀 (豆瓣推理小說資訊)

1. 事前準備: 瞭解scrapy的基本命令及弄懂scrapy文件中例子的專案結構等基本資訊 下文將假設大家已經有了以上準備, 對一些細節不會詳細闡述, 如有不懂可以先翻翻文件或留言詢問下載本例子原始碼(文章末尾)2. 豆瓣頁面分析 我們準備'下手'的是豆瓣推理小說的資料,

python豆瓣電影top250資訊

1、本博文中程式碼是轉載內容,原文章地址如下: https://blog.csdn.net/submit66/article/details/78631342?utm_source=blogxgwz1 2、只是在原文程式碼的基礎上稍作修改,添加了一些註釋及無關緊要的程式碼 3、本

Python之簡單豆瓣讀書資訊

最近出差學習,閒來擼一把 Python。看語法書這些,真是看完就忘,還不如來寫點小程式,有實踐性又有趣。 我的環境是Ubuntu 17,開始之前先裝幾個依賴包,用於解析 html 檔案。 sudo apt install python-lxml,python-requests

入門級爬蟲 豆瓣top250 的電影資訊

import requests import lxml.html from bs4 import BeautifulSoup import re import bs4 from pymongo impo

用Jsoup爬蟲豆瓣書籍資訊

抓取豆瓣上的書籍資訊 之前有一個愛立信外包的獵頭聯絡我,先是幫我推簡歷,然後讓程式設計實現爬蟲,抓取豆瓣上網際網路、程式設計、演算法的書籍資訊,自己太菜,電面就跪了。。。。。。但還是把自己的實現分享出來 題目如下:將豆瓣(book.douban.com)裡的

簡單Python爬蟲例項:豆瓣熱映電影資訊

最近在學習Python爬蟲基礎,僅用部落格記錄下學習的過程。學習過程基於麥子學院的課程,感謝麥子學院,感謝Joey老師。那麼我們來看一下,怎麼抓取資料。Chrome瀏覽器有一個開發者工具,很適合檢視網頁原始碼,所以我們用Chrome。開啟之後是這樣:然後我們在網頁位址列輸入豆

網路爬蟲--python豆瓣同城北京地區活動資訊

import re import requests import os import sys #url = 'https://beijing.douban.com/events/future-music?start=0' #header = {'User-Agent':'Mozilla/5.0 (Windo

使用BeautifulSoup方法豆瓣電影資訊

# -*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup import chardet import re import xlwt #獲取某頁的內容 def getHtml(ind

[Python]豆瓣電影列表的標題

使用Python2.7寫的指令碼,用來抓取豆瓣電影評分排行的標題。程式碼如下: #coding=utf-8 import urllib import re #匯入正則表示式庫 global x  #全域性變數 x=1 url="http://ww

爬蟲 - 動態分頁 遊民星空 的資訊 - bs4

# coding=utf-8 # !/usr/bin/env python ''' author: dangxusheng desc : 動態分頁抓取 遊民星空 的資訊 date : 2018-08-29 ''' import requests from bs4 impo

微信程式頁面丶程式原始碼

使用TBS爬取微信小程式頁面 轉載來源:https://my.oschina.net/sumiao/blog/1587350?utm_source=debugrun&utm_medium=referral 獲取任何微信小程式原始碼 轉載來源:https://blog.csdn.n

Scrapy入門例項(使用Scrapy豆瓣電影top250榜單)

專案地址:https://github.com/yuanfuzhi/ScrapyDemo.git 一  Scrapy介紹與安裝 1,  Scrapy介紹 Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中

使用selenium+BeautifulSoup 京東商城手機資訊

1.準備工作: chromedriver  傳送門:國內:http://npm.taobao.org/mirrors/chromedriver/   vpn: selenium  BeautifulSoup4(美味湯) pip3 instal

Python爬蟲案例:豆瓣程式設計類高評分書籍

對於很多正在學習計算機的朋友來說,選擇合適的學習材料是非常重要的。 本文將通過 Python 來爬取豆瓣程式設計類評分大於 9.0 的書籍。 此案例很適合入門爬蟲的朋友學習,總共也就 3 個函式。 下圖是最終的結果: 下面進入正題: 一、採集源分析: 首先我們

教您使用java爬蟲geccoJD全部商品資訊

轉自:http://www.geccocrawler.com/demo-jd/ gecco爬蟲 如果對gecco還沒有了解可以參看一下gecco的github首頁。gecco爬蟲十分的簡單易用,JD全部商品資訊的抓取9個類就能搞定。 JD網站的分析

Python爬蟲(BeautifulSoup)實戰:豆瓣讀書新書速遞模組

import requests from bs4 import BeautifulSoup html = requests.get('https://book.douban.com/').text s

Burp Suite微信程式資料包(HTTPS)

1、電腦放熱點,然後用手機連線熱點。 2、手機連線該熱點,在電腦的移動熱點—設定中可以看到連線的裝置。 3、檢視電腦無線網路的IP地址,cmd—ipconfig—無線區域網介面卡 本地連線* 10—IPV4地址 4、開啟手機網路設定,長按連線的無線網路名稱,修改

[Python爬蟲] 7-Charles微信程式

最近在嘗試抓取微信的小程式,用到了Charles,微信小程式的話需要使用HTTPS抓包,網上有些教程內容有步驟的缺失,所以重新整理一份傻瓜式的教程,環境WIN10+IOS,內容基於Roy_Liang前輩

python3實現貓眼top100電影資訊

前言:最近正在學習python爬蟲,瞭解一些基礎知識後,還是要實踐動手熟悉。下面文章例子有空再加備註。。import requests import re import json import time from requests.exceptions import Requ

python實踐2——利用爬蟲豆瓣電影TOP250資料及存入資料到MySQL資料庫

這次以豆瓣電影TOP250網為例編寫一個爬蟲程式,並將爬取到的資料(排名、電影名和電影海報網址)存入MySQL資料庫中。下面是完整程式碼:Ps:在執行程式前,先在MySQL中建立一個數據庫"pachong"。import pymysql import requests imp