Python爬虫携程池爬取テンセントアニメ

9263 ワード

概要
主にテンセントのアニメーションの上である漫画のすべてのピクチャーのurlを登り取ります
  • で使用するライブラリ
  • 分析テンセントアニメサイト
  • コード
  • 使用するライブラリ
  • gevent gevent.pool
  • requests
  • selenium
  • xpath

  • テンセントのアニメーションを分析します
    私が大神仙であるという無料漫画を例に、そのラベルを分析します.urlアドレスはac.qq.com/Comic/Comic…
  • 漫画章url
  • を取得
        621058        
        #     
        el.xpath('//*[@id="chapter"]/div[2]/ol[1]/li')
        #           
        startswith((' ', ' '))
        #            
        list_url.append(item)
        self.queue.put(item)
    
  • 漫画章詳細
  • 第111話ac.qq.com/ComicView/i…
    2つの方法でリスト画像urlを取得
  • 最初のseleniumシミュレーションブラウザのスライドによって実際のurlを取得する方法は遅く、スライドが速すぎるためurlアドレスがロードされない場合がある.もちろんスライド時間を設定することで
  • を得ることができる.
    browser.get('http://ac.qq.com/ComicView/index/id/621058/cid/122')
    for i in range(10):
        js = 'window.scrollTo(' + str(i * 1280) + ',' + str((i + 1) * 1280) + ')'  #            
        browser.execute_script(js)
        time.sleep(1)
    
  • 第2の解析ページスライド中にロードされたjs
  •               imgurl                   DATA     
            script     var DATA =""                  js           
    
                    DATA               url  
    
            DATA   ?      DATA      PICTURE     
         selenium      var DATA               selenium 
         def get_img_list(self, html_str):
            browser = self.webdirver(html_str)
            list_tmp = []
            # selenium     return       
            pic_list = browser.execute_script("return PICTURE")
            for pic in pic_list:
                item = {}
                item['href'] = pic['url']
                list_tmp.append(item)
            browser.quit()
            return list_tmp
    

    コード#コード#
    import gevent.monkey
    gevent.monkey.patch_all()
    
    import json
    import time
    from queue import Queue
    
    import os
    import requests
    from gevent.pool import Pool
    from lxml import etree
    from pymongo import MongoClient
    
    from selenium import webdriver
    
    """
         
        
    1.     url
    2.     url
    3.     url
    """
    class TencentCarton(object):
    
        def __init__(self):
            self.start_url = "http://ac.qq.com/Comic/ComicInfo/id/621058"
            self.headers = {
                "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
            }
            self.part_url = "http://ac.qq.com"
            self.queue = Queue()
            self.pool = Pool(5)
            self.is_running = True
            self.total_request_num = 0
            self.total_response_num = 0
            self.str_ss = "./     /"
    
        def get_url_list(self):
            html = self.parse_url(self.start_url)
            el = etree.HTML(html)
            li_list = el.xpath('//*[@id="chapter"]/div[2]/ol[1]/li')
            list_url = []
            for li in li_list:
                for p in li.xpath("./p"):
                    for span in p.xpath("./span[@class='works-chapter-item']"):
                        item = {}
                        list_title = span.xpath("./a/@title")[0].replace(' ', '').split(':')
                        if list_title[1].startswith((' ', ' ')):
                            item['name'] = list_title[1]
                            item['href'] = self.part_url + span.xpath("./a/@href")[0]
                            item['title'] = list_title[0]
                            list_url.append(item)
                            self.queue.put(item)
                            self.total_request_num += 1
    
        def parse_url(self, url):
            res = requests.get(url, headers=self.headers)
            return res.content.decode()
    
        def webdirver(self, html_str):
            chrome_options = webdriver.ChromeOptions()
            chrome_options.add_argument('--headless')
            browser = webdriver.Chrome(chrome_options=chrome_options)
            #                
            browser.get(html_str)
            return browser
    
        def get_img_list(self, html_str):
            browser = self.webdirver(html_str)
            list_tmp = []
            pic_list = browser.execute_script("return PICTURE")
            for pic in pic_list:
                item = {}
                item['href'] = pic['url']
                list_tmp.append(item)
            browser.quit()
            return list_tmp
    
        def save_content_list(self, data):
            json_str = json.dumps(data, ensure_ascii=False, indent=2)
            if not os.path.exists(self.str_ss):
                os.mkdir(self.str_ss)
            with open(self.str_ss + data['name'] + ".json", 'w', encoding='utf-8') as f:
                f.write(json_str)
            print(data['name'], "    ")
    
        def _execete_request_content_save(self):
            item = self.queue.get()
            print(item['href'], "    ")
            try:
                item['imge_list'] = self.get_img_list(item['href'])
            except Exception as f:
                print(f)
            #   
            self.save_content_list(item)
            self.total_response_num += 1
    
        def _callback(self, temp):
            if self.is_running:
                self.pool.apply_async(self._execete_request_content_save, callback=self._callback)
    
        def run(self):
            # 1.   url  
            self.get_url_list()
            print(self.queue.qsize())
            for i in range(3):  #       3
                self.pool.apply_async(self._execete_request_content_save, callback=self._callback)
    
            while True:
                time.sleep(0.0001)
                if self.total_response_num >= self.total_request_num:
                    self.is_running = False
                    break
    
    
    if __name__ == '__main__':
        t1 = time.time()
        TC = TencentCarton()
        TC.run()
        print("total cost:", time.time() - t1)