Python爬虫携程池爬取テンセントアニメ
9263 ワード
概要
主にテンセントのアニメーションの上である漫画のすべてのピクチャーのurlを登り取りますで使用するライブラリ 分析テンセントアニメサイト コード 使用するライブラリ gevent gevent.pool requests selenium xpath
テンセントのアニメーションを分析します
私が大神仙であるという無料漫画を例に、そのラベルを分析します.urlアドレスはac.qq.com/Comic/Comic…漫画章url を取得漫画章詳細 第111話ac.qq.com/ComicView/i…
2つの方法でリスト画像urlを取得最初のseleniumシミュレーションブラウザのスライドによって実際のurlを取得する方法は遅く、スライドが速すぎるためurlアドレスがロードされない場合がある.もちろんスライド時間を設定することで を得ることができる.第2の解析ページスライド中にロードされたjs
コード#コード#
主にテンセントのアニメーションの上である漫画のすべてのピクチャーのurlを登り取ります
テンセントのアニメーションを分析します
私が大神仙であるという無料漫画を例に、そのラベルを分析します.urlアドレスはac.qq.com/Comic/Comic…
621058
#
el.xpath('//*[@id="chapter"]/div[2]/ol[1]/li')
#
startswith((' ', ' '))
#
list_url.append(item)
self.queue.put(item)
2つの方法でリスト画像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)
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)