是時候 給你說說php
爬蟲框架了css
使用框架來爬取數據html
會節省咱們更多時間python
很快就能抓取到咱們想要抓取的內容ios
框架集合了許多操做nginx
好比請求,數據解析,存儲等等web
均可以由框架完成sql
有些小夥伴就要問了shell
你他媽的數據庫
爲何不早點說呢?
是這樣的
當你不知道 1+1 是什麼的時候
你去使用計算器來計算
也是沒用的
對吧
因此框架的使用
在如今這個時候(爬蟲28篇以後)講
就是一個不錯的時機
今天
小帥b就跟你說說
scrapy這個框架
到底有多牛b
那麼
接下來就是
要使用 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 裏面
咱們使用以下命令獲取
'//*[@id="content-left"]') > content_left_div = response.xpath(
接着咱們獲取它下面的全部 div
'./div') > content_list_div = content_left_div.xpath(
咱們試着獲取這個頁面的全部做者名稱和內容
做者名稱位於 a 標籤下的 h2
內容位於div下的span
咱們仍是同樣
經過 xpath 獲取
咱們先來獲取一個條目看看
content_div = content_list_div[0]
獲取做者名稱
'./div/a[2]/h2/text()').get() > author = content_div.xpath( > print(author)
街角*
獲取段子內容
'./a/div/span/text()').getall() > content = content_div.xpath( > 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