前言:
在2020年8月份達內開設scrapy高階研討會。主要內容是透過docker跟splash動態渲染javaScript。抓取104人力銀行的html元素內容,跟一些JSON響應。並建立資料庫來儲存職務內容、待遇、公司等...資料。
實作:
首先先安裝docker。docker 官方安裝腳本官方安裝腳本指令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
安裝完成後 docker pull splash 並啟動
sudo docker pull scrapinghub/splash
以及啟動splash在背景執行
sudo docker run -itd -p 8050:8050 --rm scrapinghub/splash
接下來修改老師的範例代碼,主要是修改spiders資料夾內爬蟲的部分。其他的一些設定可以不用動,或者你也可以new一個新的scrapy Project 只是相關設定需要調整。在setting.py那裏。
#python3 spiders/pixiv.py:
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest
import urllib.request
import ssl
import json
import re
class PixivSpider(scrapy.Spider):
name = 'pixiv'
allowed_domains = ['pixiv.com']
def start_requests(self):
yield scrapy.Request(
##輸入作者 ID
url="https://www.pixiv.net/ajax/user/作者id/profile/all?lang=zh_tw",
headers={"Content-Type": "application/json"},
##請輸入保存的cookie 這樣就可以loginbypass了
cookies={'PHPSESSID': '40userID_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'},
callback=self.detail_requests
)
def detail_requests(self, response):
yield SplashRequest(response.request.url, self.deep_request, meta={'url': response.request.url},
endpoint='render.html',
dont_filter=True)
def deep_request(self, response):
my_json = response.body.decode('utf8').replace("'", '"')
select_json = re.findall('pre-wrap;">(.*?)</pre>', my_json)[0]
json_data = json.loads(select_json)
print(json_data)
# 獲取作者作品 ID
for key in json_data['body']['illusts']:
url_origin = "https://www.pixiv.net/ajax/illust/" + key + "/pages?lang=zh_tw"
print(url_origin)
yield SplashRequest(url_origin, self.final_requset, meta={'url': url_origin},
endpoint='render.html',
dont_filter=True)
def final_requset(self, response):
print(response.url)
jpg_id = re.findall('/illust/(.*?)/pages', response.url)
print(jpg_id)
myJson = response.body.decode('utf8').replace("'", '"')
selectJson = re.findall('pre-wrap;">(.*?)</pre>', myJson)[0]
jsonData = json.loads(selectJson)
count = 0
for url in jsonData['body']:
count += 1
urls = url['urls']['original']
# 這是網上提供的方式 可以有效防止403
ssl._create_default_https_context = ssl._create_unverified_context
header = "https://www.pixiv.net/artworks/" + jpg_id[0]
opener = urllib.request.build_opener()
opener.addheaders = [("Referer", header)]
urllib.request.install_opener(opener)
jpgName = "/Users/lintengzhu/Desktop/pixiv/img_test/imgs/" + jpg_id[0] + str(count) + ".jpg"
print(jpgName)
urllib.request.urlretrieve(urls, jpgName)
正則匹配的部分使用『點心問號』其實很好記在可以搜尋匹配括號中間的文本用來抓連接非常方便。
這份代碼到我現在寫文章的時間點都可以爬取圖片,所以可疊代性應該是不錯的。不像我的搶購專案免洗的。我在這也提供我的git。有需要的話歡迎clone。
git clone https://github.com/yusei27017/Pixiv.git
感言:
其實我還是希望中心可以多開設高階研討會。隨然我那時候不在場。但是老師留下來的資源都是很棒的。像是影像帶,或著代碼。只要改ㄧ改就能用。所以如果可以的話還是會希望有新的或著實用的技術可以用高階研討會的形式做個分享。這樣可以幫助很多同學。像是我。隨然我不爬104但是我爬圖片。總之感謝分享,希望可以繼續。