之前也有寫過爬蟲,抓過網易雲歌單和豆瓣讀書的數據,當時有兩個問題解決的不夠好, 自動化和登陸。最近花時間用scrapy去寫,自認爲更好的解決了上述問題。這篇文章看成一個記錄,也可看成學習教程(須要BeautifulSoup, selenium基本知識)。css
用scrapy去抓取自從有了知乎,不再用找福利了……收藏夾下每個答案下的所有圖片。html
{'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
一. 先從2開始,目標:如何拍好私房照?連接下的全部圖片。github
scrapy start zhihu
簡單介紹一下,工程目錄:
zhihu/spiders
:爬蟲的主要文件。 zhihu/items.py
:須要抓取的數據結構 zhihu/middlewares.py
:中間鍵文件,selenium處理動態網頁。 zhihu/pipelines.py
:保存items中定義的數據結構或者下載圖片(處理item)。其他文件都是額外生成,不屬於爬蟲目錄。 cookies.pkl
:保存登陸的cookies, 下次登陸。 questions.json
: 保存全部問題的連接,方便後續使用。 上面兩個文件都是在第一步用到, 後續再講。json
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
啓動爬蟲,看輸出結果。 瀏覽器
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
BeautifulSoup
的使用能夠看官方文檔,簡單明瞭。 獲取圖片的css selector,提取圖片連接。 打開該url, 右擊任何一張圖片,檢查便可看到該圖片的位置。
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對網頁分析。 結果以下: 網絡
figure
標籤。 分別對
figure
,
figure
的子標籤
img
及其
data-original
屬性進行輸出。 粘貼屬性到瀏覽器打開便可看到圖片。 到此爲止, 對
如何拍好私房照?連接第一頁的圖片基本抓取完成。後面介紹怎麼使用selenium對該連接下全部圖片進行抓取。
有疑問請加weixin:youquwen1226,一塊兒探討。 github:https://github.com/yunshuipiao數據結構