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

最新文章

  1. 【Mail】邮件的基础知识和原理
  2. 移动Windows用户文件夹的方法研究
  3. 线程---JDK查看线程
  4. I.MX6 git patch
  5. HDU 5765 Bonds 巧妙状压暴力
  6. 火车票硬座座位位置分布图、火车座位分布图 andydao
  7. JavaScript网站设计实践(七)编写最后一个页面 改进表单
  8. SQL整理3
  9. Java NIO 转载
  10. IOS 跳转到系统的url
  11. Java实现二叉树先序,中序,后序遍历
  12. MySQL显示状态信息
  13. Spring(三):Spring整合Hibernate
  14. centos 7下安装mysql-8.0
  15. SpringCloud学习5-如何创建一个服务提供者provider
  16. js forEach跳出循环
  17. Java char
  18. docker 获取容器id
  19. TCP/IP协议、HTTP协议
  20. Merge Interval leetcode java

热门文章

  1. NetCore利用CsvHelper解析支付宝对账单
  2. python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)
  3. JMeter 并发压力测试
  4. 互斥量mutex简介
  5. elasticsearch启动问题
  6. echarts 报表使用
  7. Spring注解详解(转)
  8. python补充4
  9. microservice-cloud-03-provider-product-8001
  10. 【索引】位图BitMap索引