scrapy 爬取斗罗大陆漫画
# -*- coding: utf-8 -*-
import scrapy
import json
import os
import urllib
import time from scrapy.http import Request
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import (
TimeoutException,
WebDriverException,
NoSuchElementException,
StaleElementReferenceException
) def gen_browser(driver_path):
'''实例化一个driver'''
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('disable-infobars')
options.add_argument("--disable-plugins-discovery")
user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
options.add_argument('user-agent="{0}"'.format(user_agent))
# ############### 专业造假 *************************** def send(driver, cmd, params={}):
'''
向调试工具发送指令
from: https://stackoverflow.com/questions/47297877/to-set-mutationobserver-how-to-inject-javascript-before-page-loading-using-sele/47298910#47298910
'''
resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
url = driver.command_executor._url + resource
body = json.dumps({'cmd': cmd, 'params': params})
response = driver.command_executor._request('POST', url, body)
if response['status']:
raise Exception(response.get('value'))
return response.get('value') def add_script(driver, script):
'''在页面加载前执行js'''
send(driver, "Page.addScriptToEvaluateOnNewDocument", {"source": script})
# 给 webdriver.Chrome 添加一个名为 add_script 的方法
webdriver.Chrome.add_script = add_script # 这里(webdriver.Chrome)可能需要改,当调用不同的驱动时
# *************** 专业造假 ###################
browser = webdriver.Chrome(
executable_path=driver_path,
chrome_options=options
)
# ################## 辅助调试 *********************
existed = {
'executor_url': browser.command_executor._url, # 浏览器可被远程连接调用的地址
'session_id': browser.session_id # 浏览器会话ID
}
print(existed)
# ********************* 辅助调试 ##################
# ############### 专业造假 ***************************
browser.add_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
window.navigator.chrome = {
runtime: {},
};
Object.defineProperty(navigator, 'languages', {
get: () => ['zh-CN', 'zh']
});
Object.defineProperty(navigator, 'plugins', {
get: () => [0, 1, 2],
});
""")
# *************** 专业造假 ###################
return browser class XuexingSpider(scrapy.Spider):
name = 'xuexing'
allowed_domains = ['www.manhuatai.com']
start_urls = ['https://www.mh1234.com/wap/comic/9683/262424.html'] def parse(self, response):
driver_path = self.settings.get('DRIVER_PATH')
# import ipdb; ipdb.set_trace()
browser = gen_browser(driver_path)
# 获取当前章节名
next_url = response.url
i = 0
while bool(next_url):
i += 1
print(str(i).center(60, '*'))
next_url = self.get_item(browser, next_url) def get_item(self, browser, url=None):
if url is not None:
browser.get(url) # 打开页面
van1 = browser.find_elements_by_xpath('//a[@class="BarTit"]')
van = van1[0].text.split('(')[0].strip()
if '/' in van:
van = '-'.join(van.split('/'))
# import ipdb; ipdb.set_trace()
if not os.path.exists('斗罗大陆'):
os.mkdir('斗罗大陆')
if not os.path.exists(van):
os.mkdir(r'斗罗大陆/{0}'.format(van))
m = 0
_url = browser.find_element_by_xpath('//*[@id="qTcms_pic"]')
img_url = _url.get_attribute('src')
# 保存图片到指定路径
if img_url != None:
m += 1
#保存图片数据
data = urllib.request.urlopen(img_url).read()
f = open('斗罗大陆/{0}/{1}.jpg'.format(van, m), 'wb')
f.write(data)
f.close()
ye = int(browser.find_element_by_xpath('//*[@id="k_total"]').text)
for yei in range(1, ye):
time.sleep(0.5)
browser.find_element_by_xpath('//*[@id="action"]/ul/li[3]/a').click()
_url = browser.find_element_by_xpath('//*[@id="qTcms_pic"]')
img_url = _url.get_attribute('src')
# 保存图片到指定路径
if img_url != None:
m += 1
#保存图片数据
data = urllib.request.urlopen(img_url).read()
f = open('斗罗大陆/{0}/{1}.png'.format(van, m), 'wb')
f.write(data)
f.close() xia = browser.find_element_by_xpath('//*[@id="action"]/ul/li[4]/a').get_attribute('href')
return xia
scrapy 爬取斗罗大陆漫画的更多相关文章
- Scrapy爬取美女图片 (原创)
有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用pyt ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- scrapy爬取西刺网站ip
# scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...
- scrapy爬取豆瓣电影top250
# -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...
- scrapy爬取极客学院全部课程
# -*- coding: utf-8 -*- # scrapy爬取极客学院全部课程 import scrapy from pyquery import PyQuery as pq from jike ...
- scrapy爬取全部知乎用户信息
# -*- coding: utf-8 -*- # scrapy爬取全部知乎用户信息 # 1:是否遵守robbots_txt协议改为False # 2: 加入爬取所需的headers: user-ag ...
- Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...
- Scrapy爬取静态页面
Scrapy爬取静态页面 安装Scrapy框架: Scrapy是python下一个非常有用的一个爬虫框架 Pycharm下: 搜索Scrapy库添加进项目即可 终端下: #python2 sudo p ...
- 用scrapy爬取京东的数据
本文目的是使用scrapy爬取京东上所有的手机数据,并将数据保存到MongoDB中. 一.项目介绍 主要目标 1.使用scrapy爬取京东上所有的手机数据 2.将爬取的数据存储到MongoDB 环境 ...
随机推荐
- VB VB 定义及区别
VB是Visual Basic的简称,是由美国微软公司于1991年开发的一种可视化的.面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发 Windows 环境下的各类应用程序.VC是Vis ...
- JavaWeb——<c:forEach varStatus="status">
我们常会用c标签来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行.偶数行差异:最后一行特殊处理等等.先就varStatus属性常用参数总结下: $ ...
- js关闭浏览器
不存在的 告诉策划:不好意思,这个需求实现不了. 旧版本浏览器有些支持window.close()方法,目前主流浏览器都不支持,就算让你 ...
- 封装poi导入篇
前言 有封装的想法好久了,项目中有不少地方需要使用导入功能,导入虽说不能,但是每次都要为了特定类写一个特定方法,很麻烦,我很讨厌一直写这种东西了,正好趁着这次机会就写一个可以解决这种问题的小项目. m ...
- Logparser介绍
原文链接:https://www.cnblogs.com/Jerseyblog/p/3986591.html Logparser是一款非常强大的日志分析软件,可以帮助你详细的分析网站日志.是所有数据分 ...
- 后台封装的easyui框架,处理texbox的时候报错:未结束的字符串常量。
原因:特殊字符导致json字符串转换成json对象出错 解决:找到初始值的地方进行过滤 代码如下: theString = theString.Replace(">", &q ...
- Python学习笔记---数 数据类型 运算
python的四种数类型: 整数 int 浮点型 float 布尔 boolen 复数 complex >>> type(5)<class 'int'>>>& ...
- P1100 高低位交换
题目描述 给出一个小于2^{32}232的正整数.这个数可以用一个3232位的二进制数表示(不足3232位用00补足).我们称这个二进制数的前1616位为“高位”,后1616位为“低位”.将它的高低位 ...
- [Flutter] 因为不讲这个重点, 全网所有 flutter 实战视频沦为二流课程
二流课程也有其存在的价值,看到不同组件的轮流使用也是不断熟悉的过程,不过太眼花缭乱了. 授人以渔,基础用法是其一,讲清套路是其二,不然坑萌新. 那么 flutter 的套路是什么呢,我认为有下面几点: ...
- celery (二) task
Task task 具有如下特点: task 可以在任何可调用的地方创建.它有双重角色: 定义了当task被调用时,会发送一个消息. 定义了当worker收到消息时会运行消息对应的函数 每个task都 ...