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. LeetCode Array Easy 122. Best Time to Buy and Sell Stock II

    Description Say you have an array for which the ith element is the price of a given stock on day i. ...

  2. 在MVC4.5.1中使用Ninject

    看完Pro ASP.NET MVC5的前14章之后,终于开始了自己的项目搭建. 打算在实际项目中使用Ninject 但是总是出现各种问题.这里记录一下 在书中使用的Ninject的版本是: Insta ...

  3. springmvc基于注解的权限控制

    一.权限码 /** * @Title: AuthCode.java * @Package cn.com.kamfu.auth * @Description: TODO(用一句话描述该文件做什么) * ...

  4. Lambda select 动态字段

    直接上代码 //测试数据 public static List<User> myList = new List<User>() { , Name=,IsChild=false} ...

  5. vue-bus全局事件中心简单Demo

    1.vue-cli搭建好项目之后,使用npm安装vue-bus npm install vue-bus 2.在入口文件main.js中全局注册 import Vue from 'vue'; impor ...

  6. 6374. 【NOIP2019模拟2019.10.04】结界[生与死的境界]

    题目 题目大意 给你一个数列,每次可以选择任意两个相邻的数\(x\)和\(y\),将其删去,并在原来位置插入\(x+2y\). 每次询问一个区间,对这个区间进行上述操作.求最后剩下的数最大是多少. 答 ...

  7. Magento 消息提示

    Magento 消息提示 //成功 Mage::getSingleton('customer/session')->addSuccess('恭喜您关联会员卡成功!'); //失败 Mage::g ...

  8. 【Dart学习】-- Dart之泛型

    一,概述  Dart是一种可选的类型语言.Dart中的集合默认是异构的.换句话说,单个Dart集合可以托管各种类型的值.但是,可以使Dart集合保持同质值.泛型的概念可以用来实现同样的目的. 泛型的使 ...

  9. 区间dp(二维)——cf1199F

    复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ...

  10. C语言新手写扫雷源代码

    今天发布源代码,由于写在一个文件里非常乱,所以分三个文件写 绘图和鼠标函数graph.h /*绘图与鼠标相关函数*/ #include<graphics.h> #include <e ...