from selenium import webdriver
import pymysql
from selenium.webdriver.support.ui import WebDriverWait # 等待
from selenium.webdriver.support import expected_conditions as ec # 等待条件
from selenium.webdriver.common.by import By
import html
import _thread
from selenium.webdriver.chrome.options import Options def ceil(x, y):
if x % y == 0: # 相除后为整数
return int(x / y)
else: # 相除有小数
return int(x / y) + 1 # 创建一个浏览器
chrome_options = Options()
chrome_options.add_argument('--headless')
dr = webdriver.Chrome(chrome_options=chrome_options) # 设置访问的网站
dr.get('https://doupocangqiong1.com/1/list_piaotian/') # 获取所有的a标签
a = dr.find_elements_by_css_selector('.dirlist > li > a') # 连接数据库
db = pymysql.connect("localhost", "root", "root", "selenium", charset='utf8')
# 获取游标
cursor = db.cursor() for i in a:
name = i.text
href = i.get_attribute('href')
sql = "INSERT INTO novel (name,href,content) VALUES ('%s','%s','%s')"%(name,href,'')
cursor.execute(sql) # 使用execute方法执行SQL语句
db.commit()
dr.close() # 关闭浏览器 def line(lineName, start, count):
dr = webdriver.Chrome(chrome_options=chrome_options) # 创建一个浏览器
# 连接数据库
db = pymysql.connect("localhost", "root", "root", "selenium", charset='utf8')
# 获取游标
cursor = db.cursor() sql = "SELECT id,href FROM novel LIMIT %s, %s"%(start, count)
cursor.execute(sql) # 使用execute方法执行SQL语句
data = cursor.fetchall() # 使用 fetchall() 方法获取所有数据
for i in data:
dr.get(i[1])
# 放置等待
WebDriverWait(dr, 5, 0.1).until_not(ec.text_to_be_present_in_element((By.CSS_SELECTOR, '#chaptercontent'),
U'正在转码,请稍后......')) # 等待dr浏览器10秒钟,每0.1秒钟问一次
content = html.escape(dr.find_element_by_css_selector('#chaptercontent').text)
# escape()将特殊字符转为特殊的编码格式,unescape()将编码格式转回特殊字符
sql = "UPDATE novel SET content = '%s' WHERE id = %s" % (content, i[0])
cursor.execute(sql) # 使用execute方法执行SQL语句
db.commit()
print(lineName, '完成了', i[0], '的采集')
dr.close() # 关闭窗口
dr.quit() # 关闭浏览器
cursor.close()
db.close()
print(lineName, '完成了采集') def productLine(func, total, lineCount):
every = ceil(total[0][0], lineCount)
print('every', every)
for i in range(lineCount):
print('-------------', i)
print(_thread.start_new_thread(func, ('line-' + str(i) + '', i * every, every))) try:
sql = 'SELECT COUNT(*) FROM novel'
cursor.execute(sql) # 使用execute方法执行SQL语句
total = cursor.fetchall() # 使用 fetchall() 方法获取所有数据
print(total) productLine(line, total, 5) except:
print ("Error: unable to start thread") while 1:
pass

用selenium 自动爬取某一本小说章节及其内容,并存入数据库中的更多相关文章

  1. selenium自动爬取网易易盾的验证码

    我们在爬虫过程中难免会遇到一些拦路虎,比如各种各样的验证码,时不时蹦出来,这时候我们需要去识别它来继续我们的工作,接下来我将爬取网一些滑动验证码,然后通过百度的EasyDL平台进行数据标注,创建模型, ...

  2. web全栈应用【爬取(scrapy)数据 -> 通过restful接口存入数据库 -> websocket推送展示到前台】

    作为 https://github.com/fanqingsong/web_full_stack_application 子项目的一功能的核心部分,使用scrapy抓取数据,解析完的数据,使用 pyt ...

  3. python网络爬虫之使用scrapy自动爬取多个网页

    前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...

  4. 如何用python爬虫从爬取一章小说到爬取全站小说

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  5. selenium异步爬取(selenium+Chromedriver)

    在我们进行数据爬去的过程中,我们有时候会遇到异步加载信息的情况,以豆瓣电影分来排行榜为例,当我们在查看数据的过程中,会发现网页源码中并不包含我们想要的全部数据,但是当我们在进行向下滚动的时候,数据会一 ...

  6. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  7. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  8. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  9. Crawlspider的自动爬取

    引子 : 如果想要爬取 糗事百科 的全栈数据的方法 ? 方法一 : 基于scrapy框架中的scrapy的递归爬取进行实现(requests模块递归回调parse方法) . 方法二 : 基于Crawl ...

随机推荐

  1. 一、hibernate环境搭建

    hibernate环境搭建 下载hibernate hibernate的jar 连接数据库的jar 解压hibernate,解压后目录结构 documentation :对应hibernate开发文档 ...

  2. android中使用MediaPlayer和SurfaceView播放视频

    package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...

  3. Vue项目引入sass

    最近两天手头的事情暂时搞完了,可以抽出空来学习一下东西,之前项目都是鹏哥搭建好了,我们在直接在里面写代码,sass语法用来写样式还是比较方便常用的,今天就来试试怎么引入和配置sass 参考文章:Vue ...

  4. Activiti获取当前活动(任务)的出口(动态生成提交按钮)

    1.设置出口变量 当一个任务有一个或多个出口时,可以在出口连线出设置判断条件如图: 2.根据任务Id获取出口集合 public List<String> getOutGoingTransN ...

  5. OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&GLEW

    最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云.逐决定先搭OpenGL运行环境,详细如下. 1.首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实 ...

  6. dubbo-源码阅读之Filter实现原理

    最近完成一个需求,使用阿里Arms需要在log里面加上traceId,但是发现dubbo异常 被ExceptionFilter捕获 并打印  打印不出traceI,然后百度搜索如何重写Filter 参 ...

  7. printf sscanf进阶

    printf ; printf (3d", a);//将打印 035 printf(“%-*s”, width, string): “*”: 在这里用width代替,其实和printf(“% ...

  8. Android中App可分配内存的大小(转)

    转自:http://blog.csdn.net/u011506413/article/details/50965435 现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多 ...

  9. MATLAB GUI 设计要点 转

    https://www.cnblogs.com/wangh0802PositiveANDupward/p/4588512.html 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: ...

  10. ansible如何用root用户运行普通用户授权

    ansible默认以root用户进行授权,但是需要用普通用户执行一些命令操作: 如: 1. ansible 10.0.0.1 -m raw -a "date" -u www 但是会 ...