python爬蟲29 | 使用scrapy爬取糗事百科的例子,告訴你它有多厲害!

是時候 給你說說php

 

爬蟲框架了css

 

使用框架來爬取數據html

 

會節省咱們更多時間python

 

很快就能抓取到咱們想要抓取的內容ios

 

框架集合了許多操做nginx

 

好比請求,數據解析,存儲等等web

 

均可以由框架完成sql

 

 

有些小夥伴就要問了shell

 

你他媽的數據庫

 

爲何不早點說呢?

 

 

是這樣的

 

當你不知道 1+1 是什麼的時候

 

你去使用計算器來計算

 

也是沒用的

 

對吧

 

因此框架的使用

 

在如今這個時候(爬蟲28篇以後)講

 

就是一個不錯的時機

 

 

今天

 

小帥b就跟你說說

 

scrapy這個框架

 

到底有多牛b

 

那麼

接下來就是

 

學習 python 的正確姿式

 

 

要使用 scrapy

 

首先固然你得須要有啊

 

你能夠使用 conda 安裝

 

conda install -c conda-forge scrapy

 

你也能夠使用 PyPI 安裝

 

pip install Scrapy

 

 

scrapy依賴一些相關的庫

 

lxmlparselw3libtwistedcryptography and pyOpenSSL

 

 

若是你在使用 scrapy 的時候發現相關庫缺失

 

把褲子穿上就是了

 

哦不是

 

把你缺失的庫安裝上就完事了

 

 

好了

 

如今假設你已經安裝好了 scrapy 這個框架

 

那麼接下來

 

小帥b會帶你使用它來爬取一下 糗事百科 的段子

 

主要讓你知道 scrapy 的使用以及體驗它的牛逼之處

 

廢話很少說

 

在你想要存放的爬蟲文件目錄下

 

使用命令來建立一個 scrapy 爬蟲項目

 

好比在這裏

 

咱們要建立一個 qiushibaike 的爬蟲項目

 

就能夠這樣

 

 scrapy startproject qiushibaike

 

這時候你就會發現

 

scrapy幫你自動生成了項目文件

 

 

 

在這裏面有一些配置文件和預約義的設置文件

 

而咱們的爬蟲代碼

 

能夠在 spiders 目錄下建立

 

在這裏咱們就建立一個 qiushibaike_spider 吧

 

 

要使用 scrapy 爬蟲

 

咱們就須要繼承  scrapy.Spider 這個類

 

這樣咱們才能使用它定義的一些方法

 

class QiushiSpider(scrapy.Spider):

 

 

接着咱們要定義一個爬蟲的名稱

 

這裏定義一個惟一的名稱

用來標識糗事的爬蟲

在項目中不能和別的爬蟲名稱同樣

等會會用到這個名稱

 

  name = "qiushibaike"

 

接着咱們就能夠來定義咱們的請求了

 

好比咱們要爬糗事百科的段子的第一和第二頁

 

因此咱們能夠這樣定義請求連接

 

 def start_requests(self): urls = [            'https://www.qiushibaike.com/text/page/1/', 'https://www.qiushibaike.com/text/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse)

 

咱們在這個方法 start_requests 須要返回一個 yield 生成的迭代 

 

而其中的參數 callback=self.parse 就是要讓它去回調咱們的數據解析方法

 

回調方法是這樣的

 

 def parse(self, response): page = response.url.split("/")[-2] filename = 'qiushi-%s.html' % page with open(filename, 'wb') as f: f.write(response.body) self.log('Saved file %s' % filename)

 

主要是把咱們抓取下來的 html 存入到本地文件

 

咱們來使用 scrapy 運行一下這個爬蟲

 

使用以下命令便可

 

 cd qiushibaike/ scrapy crawl qiushibaike

 

scrapy crawl qiushibaike 中的 qiushibaike 就是咱們剛剛定義的名稱

 

不過這個時候運行後你會發現報錯了

 

 

這是由於你懂得

 

糗事作了反爬

 

咱們定義一個 header 吧

 

 haders = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36' }
def start_requests(self): urls = [ 'https://www.qiushibaike.com/text/page/12/', 'https://www.qiushibaike.com/text/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse, headers=self.haders)

 

再次運行命令

 

scrapy crawl qiushibaike

 

此次能夠發現

 

源代碼被咱們爬取下來了

 

 

是否是很方便咧

 

接下來咱們再來解析關鍵數據

 

好比咱們只須要段子的做者和段子的內容

 

scrapy 也內置了 css、xpath 選擇器的解析了

 

並且

 

scrapy 還內置了不少好用的命令

 

咱們能夠使用 scrapy shell 來請求咱們的網頁

 

scrapy shell /home/wistbean/PycharmProjects/spider/qiushibaike/qiushi-1.html

 

shell 後面能夠是你爬下來的 HTML 文件

 

也能夠是你一個連接

 

進去以後是這樣的

 

 

咱們能夠在這裏面作一些命令操做了

 

好比咱們在這裏坐一下解析操做

 

打開咱們剛剛要爬的糗事百科的連接

 

 

 

能夠看到

 

每一個段子都被包含在一個 id 爲 content-left 的 div 裏面

 

咱們使用以下命令獲取

 

>>> content_left_div = response.xpath('//*[@id="content-left"]')

 

接着咱們獲取它下面的全部 div 

 

>>> content_list_div = content_left_div.xpath('./div')

 

咱們試着獲取這個頁面的全部做者名稱和內容

 

做者名稱位於 a 標籤下的 h2

 

 

內容位於div下的span

 

咱們仍是同樣

 

經過 xpath 獲取

 

咱們先來獲取一個條目看看

 

content_div = content_list_div[0]

 

獲取做者名稱

 

>>> author = content_div.xpath('./div/a[2]/h2/text()').get()>>> print(author)
街角*

 

獲取段子內容

 

>>> content = content_div.xpath('./a/div/span/text()').getall()>>> print(content)['\n\n\n剛上小學一年級時,一次肚子有點不舒服拉肚子,跑到廁所後運動褲上面的繩子居然打了死結,在廁所裏面如無頭蒼蠅同樣亂轉。', '這時看到老師在旁邊上蹲坑,也不顧難爲情了'此時老師蹲在蹲坑躲閃不及,渾身上下星星點點,屎噴了滿臉如同長滿麻子般!', '又是開心的一天,沒有拉褲子!\n\n']>>> 

 

 

這樣

 

咱們就經過命令行的方式能夠知道如何獲取咱們想要的數據了

 

回到代碼來

 

 

咱們把 parse 方法改爲這樣

 

 def parse(self, response):
content_left_div = response.xpath('//*[@id="content-left"]') content_list_div = content_left_div.xpath('./div')
for content_div in content_list_div: yield { 'author': content_div.xpath('./div/a[2]/h2/text()').get(), 'content': content_div.xpath('./a/div/span/text()').getall(), }

 

而後再使用命令行運行

 

scrapy crawl qiushibaike

 

 

能夠看到咱們要的信息被打印出來了

 

 

 

那麼

 

要將爬下來的數據存儲爲 json 文件怎麼辦呢

 

一個命令就搞定了

 

scrapy crawl qiushibaike -o qiushibaike.json

 

運行以後你會看到你的項目下多了一個 json 文件

 

 

不過中文亂碼了

 

在 settings.py 中加一句

 

FEED_EXPORT_ENCODING = 'utf-8'

 

咱們在運行一下

 

 

 

中文回來了

 

 

什麼?

 

你想實現翻頁抓取全部內容?

還想保存到數據庫裏?

 

好吧

 

篇幅有限

 

今天就到這裏

 

且聽帥b下回講解

 

peace

 

相關文章
相關標籤/搜索