Hello,大家好解恰。作為簡書新人避咆,熱愛coding舟肉,于是我們就來寫個爬蟲吧。
動漫之家作為國內(nèi)有名的漫畫網(wǎng)站查库,我個人挺喜歡在上面看動漫的路媚,所以,閑暇之余就寫了這個爬蟲樊销,作為一個實戰(zhàn)整慎,希望學爬蟲的人有個很好的開端。
本代碼使用Python進行書寫围苫。
分析頁面
首先裤园,我們用Chrome打開動漫之家的全部漫畫頁面,然后打開F12進行Debug調(diào)試剂府。
由于我們寫的爬蟲為搜索爬蟲拧揽,即有篩選性質(zhì)的選擇爬蟲。因此腺占,擺在我們面前的第一件事就是分析搜索的功能實現(xiàn)淤袜。
- 輸入關(guān)鍵字并點擊搜索
- post關(guān)鍵字到服務器并處理請求
- 返回搜索的結(jié)果并渲染頁面
正如上述分析的過程,我們最主要的就是跟蹤post的請求過程衰伯。這里就借助于Chrome的Debug開發(fā)工具铡羡,然后根據(jù)過程來嘗試分析一下post請求。
可以看出Chrome捕獲了post請求的過程意鲸,然后我們可以清楚的看到當我們點擊搜索時候請求的URL鏈接地址烦周。所以,我們爬蟲的第一次請求post向這個URL怎顾。
接著我們繼續(xù)分析读慎,將紅框的內(nèi)容往下拉,可以看到一堆請求和影響的Headers信息槐雾,以及我們post的參數(shù)內(nèi)容信息贪壳。
可以看到它的參數(shù)組成為鍵值對類型,具體寫成:
{"keywords": "第一次的Gal"}
瞧完了post的請求過程之后蚜退,我們就可以來分析一下響應的內(nèi)容闰靴。我們點擊Response Tab頁面,可以看出響應的內(nèi)容為一個完整的HTML頁面钻注。
由于我們的最終目的是爬取我們搜索的漫畫內(nèi)容蚂且,因此,在獲取搜索的響應之后幅恋,我們需要繼續(xù)進行Deep爬取杏死。
我們看到了搜索的結(jié)果僅有一部漫畫,所以我們可以來獲取它的Deep鏈接。右鍵點擊“檢查”淑翼,可以跳轉(zhuǎn)到當前的頁面的DOM節(jié)點腐巢。
通過右側(cè)的dom節(jié)點觀察,當前的漫畫對應的詳情頁的URL為a標簽的href屬性玄括。當然除此之外冯丙,還可以提取出漫畫名、作者遭京、最新更新狀態(tài)等胃惜。
代碼
因為Python強大的庫資源,這里將借助Python的方便的requests庫進行代碼的書寫哪雕。
# -*- coding: utf-8 -*-
import requests
import json
from lxml import etree
import click
SEARCH_URL = 'https://www.dmzj.com/dynamic/o_search/index'
def post_request(keywords):
response = requests.post(SEARCH_URL, data={"keywords": str(keywords)})
try:
html = etree.HTML(response.content)
ul_tags = html.xpath('//ul[@class="update_con autoHeight"]/li')
res = []
item = {}
for li_tag in ul_tags:
item['name'] = li_tag.xpath('./a/@title')[0]
item['url'] = li_tag.xpath('./a/@href')[0]
item['cover'] = li_tag.xpath('./a/img/@src')
item['author'] = li_tag.xpath('//p[@class="auth"]/text()')[0]
item['status'] = li_tag.xpath('//p[@class="newPage"]/text()')[0]
click.echo(json.dumps(item, ensure_ascii=False))
except Exception as e:
raise e
if __name__ == '__main__':
inputs = click.prompt("輸入搜索的漫畫名稱", type=str)
post_request(inputs)
此處應用的庫主要為click船殉、requests、lxml
采用的DOM分析形式為Xpath斯嚎,所有的Python庫均使用pip安裝
謝謝大家了利虫,這是第一次在簡書寫文章,希望大家支持堡僻,下一篇將進一步往Deep分析糠惫。這些代碼之后會在Github上放置,歡迎大家來查看苦始!