小試牛刀 (抓取豆瓣推理小說資訊)
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.py裡定義為如下欄位
items.png
接下來, 我們要在spiders/douban.py寫關於爬蟲的東西
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
我們可以用view(response)
在瀏覽器中開啟這個連結,這個連結看到的頁面就是爬蟲看到的頁面了,之前說過了,用js輸出的頁面跟爬蟲看到的頁面有時會不一樣,在爬取時可能看不到我們要的資訊,在爬複雜的網站時要注意。
然後我們可以在這個命令列內,對response進行xpath,css操作得到標籤,比如說我們要得到小說資料圖中的白夜叉這個書名,我們可以根據chrome的審查元素右鍵的copy xpath或copy css path功能得到標籤的路徑
copy xpath.png
我們得到的路徑可能是這樣的:
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
最多匹配到999頁了,如果還是覺得不爽,可以查查scrapy的CloseSpider異常,丟擲該異常可以暫停/停止爬蟲。
最終我們爬取的部分資料如下,
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爬蟲gecco抓取JD全部商品資訊
轉自: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