初心者は爬虫類(四)Pythonに英語の新刊書を登ってリンクをダウンロードします

4810 ワード

この文はPython関連英語新書ダウンロードリンク一文のコード実装部分で、著者がやったことがあるが、私は自分でScrapyを再利用して実現した.
  • 前の初心者が爬虫類(三)他の人の爬虫類に何をしているのか、あなたの曲線を描くのと比べると、実はあまり違いません.
  • は、scrapy.Request関数のmetaパラメータを使用して、2回の要求の応答において
  • を伝達する.
  • 動的jsページの処理:今回,ページはロード後にjsコードを自動的に実行してhtml要素の属性を変更し,リンクを追加する.まず私が思いついたのは、jsコードに従って対応するpythonコードを変更し、pythonコードの演算で最終的に取得したい値を得ることです.速度は速いが、煩雑で、汎用性が足りず、潜在的な問題もある可能性があります.そこで、最も汎用的なseleniumを選択してブラウザのロードページを制御し、jsを自動的に実行した後のページを取得し、正規分析ページを利用することで、少し遅いです.しかし、比較的便利で安定しています.

  • また、今回登ったネットディスクのリソースは異なるサーバに置かれており、対応はwwwxyである.zippyshare.com,xyは数字で異なるサーバを区別するので,ページ上で相対ルーティングを取得した後に正しいサーバドメイン名を加える.また、このサイトのネットディスクリソースリンクは時効性があり、しばらくするとリソースの取得経路をリセットし、元のリソースリンクはダウンロードインタフェースに再ルーティングされます.後処理中の迅雷ダウンロードについては、すべてのリンクを1つのtxtファイルに入れる方法を採用し、すべてのリンクをコピーすると迅雷がダウンロードを検知して尋ねるとともに、別の文章のmarkdownファイルを生成して選択しやすいようにしました.また、scrapyは2つのブラウザウィンドウを開くという小さなバグもありますが、1つだけで機能に影響を及ぼさず、しばらくは管理されていません.友達が教えてくれたら、ありがとうございます.

  • 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')