快上車,scrapy爬蟲飆車找福利(一)

之前也有寫過爬蟲,抓過網易雲歌單和豆瓣讀書的數據,當時有兩個問題解決的不夠好, 自動化和登陸。最近花時間用scrapy去寫,自認爲更好的解決了上述問題。這篇文章看成一個記錄,也可看成學習教程(須要BeautifulSoup, selenium基本知識)。css

目標

用scrapy去抓取自從有了知乎,不再用找福利了……收藏夾下每個答案下的所有圖片。html

簡易步驟

  1. 帳號登陸知乎,抓取所有答案的連接(去除重複文章,大概39個答案)。
{'url': '/question/36007260', 'title': '女生堅持健身是種什麼樣的體驗?', 'dec': ['健身']}
{'url': '/question/22132862', 'title': '女生如何選購適合本身的泳裝?', 'dec': ['泳裝']}
{'url': '/question/22918070', 'title': '女生如何健身鍛造好身材?', 'dec': ['健身']}
{'url': '/question/24214727', 'title': '大胸妹子如何挑選合身又好看的比基尼?', 'dec': [ '比基尼']}
{'url': '/question/263451180', 'title': '你以爲健身時哪一個訓練動做最酷炫?', 'dec': ['健身']}
{'url': '/question/28586345', 'title': '有馬甲線是種怎樣的體驗?', 'dec': ['馬甲線']}
{'url': '/question/68734869', 'title': '2017 年,你解鎖了哪些運動技能?能夠用「視頻」展現麼?', 'dec': ['解鎖']}
{'url': '/question/31983868', 'title': '有什麼好看的泳裝推薦?', 'dec': ['泳裝']}
複製代碼

如上,對每個問題提取url, 標題和關鍵字,保存到json文件方便後續工做。git

  1. 對每個答案,抓取該答案下全部圖片連接, 保存或者下載(此處用到selenium)。
  2. 結果:半天時間抓去圖片20000+張, 部分以下:
    屏幕快照 2017-12-23 23.18.04.png

詳細步驟

一. 先從2開始,目標:如何拍好私房照?連接下的全部圖片。github

  1. 新建工程 :scrapy start zhihu 簡單介紹一下,工程目錄:
    image.png
    zhihu/spiders:爬蟲的主要文件。 zhihu/items.py:須要抓取的數據結構 zhihu/middlewares.py:中間鍵文件,selenium處理動態網頁。 zhihu/pipelines.py:保存items中定義的數據結構或者下載圖片(處理item)。

其他文件都是額外生成,不屬於爬蟲目錄。 cookies.pkl:保存登陸的cookies, 下次登陸。 questions.json: 保存全部問題的連接,方便後續使用。 上面兩個文件都是在第一步用到, 後續再講。json

  1. 最簡單的爬蟲 相信看到這的童鞋都有用過requests庫, BeautifulSoup去寫過簡單的爬蟲。 這裏不作討論。 在zhihu/spiders下新建zhihu.py文件,從這裏開始。
import scrapy
class Zhihu(scrapy.Spider):
    name = "zhihu"
    urls = ["https://www.zhihu.com/question/22856657"]
    yield request

    def start_requests(self):
        for url in self.urls:
            request = scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        print(response.url)
        print(response.body)
複製代碼

name定義了爬蟲的名字,urls定義須要爬取的連接,從start_requests開始,yield對每個url執行獲得生成器, scrapy通過網絡請求返回後調用parse函數。 接下來在項目目錄執行scrapy crawl zhihu 啓動爬蟲,看輸出結果。 瀏覽器

image.png
能夠看到輸出的url和html代碼,最簡單的爬蟲執行完畢。 關鍵:該開始運行必定要日誌輸出。
image.png
遇到上述問題,須要打開 settings文件作以下設置:

#重試設置
RETRY_ENABLE = False

# 日誌輸出
LOG_ENABLED = True
LOG_LEVEL = "INFO"
複製代碼

取消失敗重試,設置日誌級別和是否輸出(對爬取無影響)。bash

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
複製代碼

下載中間鍵中取消默認的UserAgent設置,以。及對robos.txt的設置。cookie

  1. 提取圖片連接。(BeautifulSoup) 關於BeautifulSoup的使用能夠看官方文檔,簡單明瞭。 獲取圖片的css selector,提取圖片連接。 打開該url, 右擊任何一張圖片,檢查便可看到該圖片的位置。
    image.png

image.png
如上所示,便可找到該img的位置。 接下來看代碼:

import scrapy
from bs4 import BeautifulSoup

class Zhihu(scrapy.Spider):
    name = "zhihu"
    urls = ["https://www.zhihu.com/question/22856657"]


    def start_requests(self):
        for url in self.urls:
            request = scrapy.Request(url=url, callback=self.parse)
            yield request

    def parse(self, response):
        print(response.url)
        resSoup = BeautifulSoup(response.body, 'lxml')
        items = resSoup.select("figure")
        print(len(items))
        for item in items:
            print(item)
            print(item.img)
            print(item.img['data-original'])
複製代碼

parse函數中,使用BeautifulSoup對網頁分析。 結果以下: 網絡

image.png
對比輸出,共計找到30個 figure標籤。 分別對 figure, figure的子標籤 img 及其 data-original屬性進行輸出。 粘貼屬性到瀏覽器打開便可看到圖片。 到此爲止, 對 如何拍好私房照?連接第一頁的圖片基本抓取完成。後面介紹怎麼使用selenium對該連接下全部圖片進行抓取。

有疑問請加weixin:youquwen1226,一塊兒探討。 github:https://github.com/yunshuipiao數據結構

相關文章
相關標籤/搜索