1. from selenium import webdriver
  2. import pymysql
  3. from selenium.webdriver.support.ui import WebDriverWait # 等待
  4. from selenium.webdriver.support import expected_conditions as ec # 等待条件
  5. from selenium.webdriver.common.by import By
  6. import html
  7. import _thread
  8. from selenium.webdriver.chrome.options import Options
  9.  
  10. def ceil(x, y):
  11. if x % y == 0: # 相除后为整数
  12. return int(x / y)
  13. else: # 相除有小数
  14. return int(x / y) + 1
  15.  
  16. # 创建一个浏览器
  17. chrome_options = Options()
  18. chrome_options.add_argument('--headless')
  19. dr = webdriver.Chrome(chrome_options=chrome_options)
  20.  
  21. # 设置访问的网站
  22. dr.get('https://doupocangqiong1.com/1/list_piaotian/')
  23.  
  24. # 获取所有的a标签
  25. a = dr.find_elements_by_css_selector('.dirlist > li > a')
  26.  
  27. # 连接数据库
  28. db = pymysql.connect("localhost", "root", "root", "selenium", charset='utf8')
  29. # 获取游标
  30. cursor = db.cursor()
  31.  
  32. for i in a:
  33. name = i.text
  34. href = i.get_attribute('href')
  35. sql = "INSERT INTO novel (name,href,content) VALUES ('%s','%s','%s')"%(name,href,'')
  36. cursor.execute(sql) # 使用execute方法执行SQL语句
  37. db.commit()
  38. dr.close() # 关闭浏览器
  39.  
  40. def line(lineName, start, count):
  41. dr = webdriver.Chrome(chrome_options=chrome_options) # 创建一个浏览器
  42. # 连接数据库
  43. db = pymysql.connect("localhost", "root", "root", "selenium", charset='utf8')
  44. # 获取游标
  45. cursor = db.cursor()
  46.  
  47. sql = "SELECT id,href FROM novel LIMIT %s, %s"%(start, count)
  48. cursor.execute(sql) # 使用execute方法执行SQL语句
  49. data = cursor.fetchall() # 使用 fetchall() 方法获取所有数据
  50. for i in data:
  51. dr.get(i[1])
  52. # 放置等待
  53. WebDriverWait(dr, 5, 0.1).until_not(ec.text_to_be_present_in_element((By.CSS_SELECTOR, '#chaptercontent'),
  54. U'正在转码,请稍后......')) # 等待dr浏览器10秒钟,每0.1秒钟问一次
  55. content = html.escape(dr.find_element_by_css_selector('#chaptercontent').text)
  56. # escape()将特殊字符转为特殊的编码格式,unescape()将编码格式转回特殊字符
  57. sql = "UPDATE novel SET content = '%s' WHERE id = %s" % (content, i[0])
  58. cursor.execute(sql) # 使用execute方法执行SQL语句
  59. db.commit()
  60. print(lineName, '完成了', i[0], '的采集')
  61. dr.close() # 关闭窗口
  62. dr.quit() # 关闭浏览器
  63. cursor.close()
  64. db.close()
  65. print(lineName, '完成了采集')
  66.  
  67. def productLine(func, total, lineCount):
  68. every = ceil(total[0][0], lineCount)
  69. print('every', every)
  70. for i in range(lineCount):
  71. print('-------------', i)
  72. print(_thread.start_new_thread(func, ('line-' + str(i) + '', i * every, every)))
  73.  
  74. try:
  75. sql = 'SELECT COUNT(*) FROM novel'
  76. cursor.execute(sql) # 使用execute方法执行SQL语句
  77. total = cursor.fetchall() # 使用 fetchall() 方法获取所有数据
  78. print(total)
  79.  
  80. productLine(line, total, 5)
  81.  
  82. except:
  83. print ("Error: unable to start thread")
  84.  
  85. while 1:
  86. 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. DDCTF 北京地铁

    这周打了ddctf,被打成了dd 北京地铁题目给了一张北京地铁图,提示如下:Color Threshold 提示:AES ECB密钥为小写字母提示2:密钥不足位用\0补全提示3:不要光记得隐写不看图片 ...

  2. vue provide/inject 父组件如何给孙子组件传值

    一般情况下我们父子组件之间的传值用的是props,这个就不多说了,但是如果想让父组件给子组件的组件传值怎么办呢,如果还用props的话肯能会比较复杂,这里我们就可以用到 provide 和 injec ...

  3. Javascript高级程序设计--读书笔记之面向对象(二)

    前面讲了面向对象的封装,这章我们就来说一说继承 1.原型链 实现原型链有一种基本模式,其代码大概如下 <script> function SuperType(){ this.propert ...

  4. org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

    最后找到我的问题,springmvc配置文件中没加 <mvc:annotation-driven/> java代码: @RequestMapping(value="/reques ...

  5. 【转载】vue-cli搭建的环境,用nginx做代理服务器,访问时显示:Invalid Host header

    来源:https://blog.csdn.net/Cookysurongbin/article/details/86077241 vue-cli搭建的环境,用nginx做代理服务器,访问时显示:Inv ...

  6. 【最新】docker 安装elasticsearch + kibana步骤【第一篇_elasticsearch】

     最近在用docker 安装elasticsearch + kibana 遇到了很多坑,最后成功安装elasticsearch + kibana (6.8.1)版本   安装了一下午,现总结过程中遇到 ...

  7. Install ncurses (ncurses-devel) and try again

    apt install libncurses5-dev libncursesw5-dev

  8. java输入一个整数N,打印1~n位数

    举个栗子:输入 3 : 打印1,2,3......999 这里要注意一个坑,不可以直接算出最大的数,然后从1开始打印 .因为当n足够大时,n位数必定会超出int范围和long范围 所以我们需要用字符串 ...

  9. vue 运行项目时,Uncaught (in promise) DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL

    npm  run dev 运行项目后 验证码显示不出来 并报错 Uncaught (in promise) DOMException: Failed to execute 'open' on 'XML ...

  10. PHP FILTER_VALIDATE_URL 过滤器

    定义和用法 FILTER_VALIDATE_URL 过滤器把值作为 URL 来验证. Name: "validate_url" ID-number: 273 可能的标志: FILT ...