初心者は爬虫類(四)Pythonに英語の新刊書を登ってリンクをダウンロードします
4810 ワード
この文はPython関連英語新書ダウンロードリンク一文のコード実装部分で、著者がやったことがあるが、私は自分でScrapyを再利用して実現した.前の初心者が爬虫類(三)他の人の爬虫類に何をしているのか、あなたの曲線を描くのと比べると、実はあまり違いません. は、 を伝達する.動的jsページの処理:今回,ページはロード後にjsコードを自動的に実行してhtml要素の属性を変更し,リンクを追加する.まず私が思いついたのは、jsコードに従って対応するpythonコードを変更し、pythonコードの演算で最終的に取得したい値を得ることです.速度は速いが、煩雑で、汎用性が足りず、潜在的な問題もある可能性があります.そこで、最も汎用的なseleniumを選択してブラウザのロードページを制御し、jsを自動的に実行した後のページを取得し、正規分析ページを利用することで、少し遅いです.しかし、比較的便利で安定しています.
また、今回登ったネットディスクのリソースは異なるサーバに置かれており、対応はwwwxyである.zippyshare.com,xyは数字で異なるサーバを区別するので,ページ上で相対ルーティングを取得した後に正しいサーバドメイン名を加える.また、このサイトのネットディスクリソースリンクは時効性があり、しばらくするとリソースの取得経路をリセットし、元のリソースリンクはダウンロードインタフェースに再ルーティングされます.後処理中の迅雷ダウンロードについては、すべてのリンクを1つのtxtファイルに入れる方法を採用し、すべてのリンクをコピーすると迅雷がダウンロードを検知して尋ねるとともに、別の文章のmarkdownファイルを生成して選択しやすいようにしました.また、scrapyは2つのブラウザウィンドウを開くという小さなバグもありますが、1つだけで機能に影響を及ぼさず、しばらくは管理されていません.友達が教えてくれたら、ありがとうございます.
Scrapy爬虫類
ファイル名は
データ後処理
scrapy.Request
関数のmeta
パラメータを使用して、2回の要求の応答においてScrapy爬虫類
ファイル名は
book1.py
で、scrapy runspider book1.py -o 2.json
を使用して実行します.seleniumでChromeブラウザを操作し、Chromedriverでダウンロードし、使用時に実行可能なファイルの場所を指定します.7行目のsearch_what
を変更して、他のリソースのすべての関連書籍リンクを取得します.ここで私が選んだのはpythonです.# -*- coding: utf-8 -*-
import scrapy
from selenium import webdriver
import re
search_what = 'python'
browser = webdriver.Chrome(r'E:\python\Scrapy2\book\book\spiders\chromedriver') # Chromedriver.exe
class Book1Spider(scrapy.Spider):
name = "book1"
allowed_domains = ["foxebook.net", "zippyshare.com"]
down_base_url = ".zippyshare.com" # wwwxy,xy
search_url = "http://www.foxebook.net/search/{}/page/{}"
book_base_url = "http://www.foxebook.net"
wd = browser #
reg = re.compile('')
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
}
num=0ページ
def start_requests(self): い すリンクを するためのデフォルトの
yield scrapy.Request(self.search_url.format(search_what, 0),
headers = self.headers,
callback = self.first_parse)
def first_parse(self, response):
max_page = response.css('.next a::attr("href")').extract_first().split('/')[-2]
print(int(max_page))
while self.num < int(max_page):
self.num += 1
yield scrapy.Request(self.search_url.format(search_what, self.num),
headers = self.headers,
callback = self.list_parse)
def list_parse(self, response):
title = response.css('h3 a::text').extract()
img = response.css('.img-responsive::attr("src")').extract()
download = response.css(' .btn-info::attr("href")').extract()
info = response.css('.info~ .info+ .info i::text').extract()
for t, im, d, inf in zip(title, img, download, info):
meta = {}
#metaパラメータを して を す
meta['title'] = t
meta['img'] = im
meta['info'] = inf
yield scrapy.Request(self.book_base_url + d,
meta = meta,
headers = self.headers,
callback = self.book_parse)
def book_parse(self, response):
book_url_list = response.css('.table-hover a::attr("href")').extract()
for i in book_url_list:
book_url = 'http' + i.split('http')[-1]
if 'zip' in book_url:#ディスク にzipが まれていることから し、 のディスクの は で、 しない
self.wd.get(book_url)#はブラウザで き、self.wd.page_sourceはブラウザの を します
try:
down_url = book_url.split('.')[0] + self.down_base_url + re.findall(self.reg, self.wd.page_source)[0]
except:
break
yield {
'title':response.meta['title'],
'img':response.meta['img'],
'info':response.meta['info'],
'down_url':down_url,
'web_pan':book_url,
}
else:
pass
# Debug
# from scrapy.shell import inspect_response
# inspect_response(response, self)
# scrapy runspider book1.py -o 2.json
データ後処理
# -*- coding: utf-8 -*-
import json
with open('2.json','r') as f:
data = json.load(f)
data = sorted(data, key =lambda x: x['info'][2:12], reverse=True)
#
with open("1.txt", 'w') as t:
#
# , ,
for i in data:
t.write(i['down_url']+'
')
with open('1.md', 'w') as m: # , ,
m.write('### Python :
')
for i in data:
m.write('- **[{title}]({down_url})**
*{info}*
![](http:{img})
---
'.format(**i))
# **i
#import datetime
#datetime.datetime.strptime(x, '%Y-%m-%d')