selenium爬取煎蛋网

直接上代码

  1. from selenium import webdriver
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as ES
  5. import requests
  6. import urllib.request
  7. import os
  8. from lxml import etree
  9. t = 0
  10. class Custer(object):
  11. driver_path = r"D:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
  12. def __init__(self):
  13. self.driver = webdriver.Chrome(executable_path=self.driver_path)
  14. self.url = "http://jandan.net/ooxx"
  15. def run(self):
  16. self.driver.get(self.url)
  17. while True:
  18. all_source = self.driver.page_source
  19. html = etree.HTML(all_source)
  20. self.xqy(html)
  21. WebDriverWait(self.driver,10).until(
  22. ES.presence_of_element_located((By.XPATH,"//div[@class='cp-pagenavi']/a[last()]"))
  23. )
  24. try:
  25. Btn = self.driver.find_element_by_xpath("//div[@class='cp-pagenavi']/a[last()]")
  26. if "Older Comments" in Btn.get_attribute("title"):
  27. Btn.click()
  28. else:
  29. break
  30. except:
  31. print("出现异常")
  32.  
  33. def xqy(self,html):
  34. all_content = html.xpath("//div[@class='row']//div")
  35. all_author = all_content[0].xpath("//div[@class='author']/strong/text()") #作者列表
  36.  
  37. #*****************给自己的重点**********************
  38. #给列表重复元素加工 如果不加工进入字典会少很多元素
  39. for index,item in enumerate(all_author):
  40. global t
  41. if item in all_author[0:index]: #判断当前元素是否与之前元素重复 如果重复,则重命名
  42. t=t+1
  43. all_author[index] = item+str(t) #如多个重命名使作者加上字符1 依次类推
  44. #***************************************************
  45.  
  46. WebDriverWait(self.driver, 10).until(
  47. ES.presence_of_element_located((By.XPATH, "//div[@class='text']//img"))
  48. )
  49. all_img = all_content[1].xpath("//div[@class='text']//img//@src") #图片列表
  50. #解决有个张图片没有http:协议
  51. for index,item in enumerate(all_img):
  52. if 'http:' not in item:
  53. all_img[index] = 'http:'+item
  54.  
  55. dic = dict(zip(all_author,all_img)) #多个列表生产字典
  56. #遍历字典保存图片
  57. for key in dic:
  58. hz = os.path.splitext(dic[key])[1] #取出后缀名.jpg/.png
  59. filename = key+hz #文件名(标题+后缀名)
  60. urllib.request.urlretrieve(dic[key],'images/'+filename)
  61.  
  62. def main():
  63. rea = Custer()
  64. rea.run()
  65.  
  66. if __name__ == '__main__':
  67. main()

爬取的图片

进阶

个人用了个多线程   但不知道是不是多线程爬取 感觉爬取速度快多了

  1. from selenium import webdriver
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as ES
  5. import requests
  6. import threading
  7. import urllib.request
  8. import os
  9. from lxml import etree
  10. t = 0
  11. gCondition = threading.Condition()
  12. class Custer(threading.Thread):
  13. driver_path = r"D:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
  14. driver = webdriver.Chrome(executable_path=driver_path)
  15. url = "http://jandan.net/ooxx"
  16. def run(self):
  17. self.driver.get(self.url)
  18. while True:
  19. all_source = self.driver.page_source
  20. html = etree.HTML(all_source)
  21. self.xqy(html)
  22. WebDriverWait(self.driver,10).until(
  23. ES.presence_of_element_located((By.XPATH,"//div[@class='cp-pagenavi']/a[last()]"))
  24. )
  25. gCondition.acquire() #加上锁(如果不加锁那么多个线程可能同时请求一个或多个图片)
  26. try:
  27. Btn = self.driver.find_element_by_xpath("//div[@class='cp-pagenavi']/a[last()]")
  28. if "Older Comments" in Btn.get_attribute("title"):
  29. gCondition.release() #解锁
  30. Btn.click()
  31. else:
  32. break
  33.  
  34. except:
  35. print("出现异常")
  36.  
  37. def xqy(self,html):
  38. all_content = html.xpath("//div[@class='row']//div")
  39. all_author = all_content[0].xpath("//div[@class='author']/strong/text()") #作者列表
  40.  
  41. #*****************给自己的重点**********************
  42. #给列表重复元素加工 如果不加工进入字典会少很多元素
  43. for index,item in enumerate(all_author):
  44. global t
  45. if item in all_author[0:index]: #判断当前元素是否与之前元素重复 如果重复,则重命名
  46. t=t+1
  47. all_author[index] = item+str(t) #如多个重命名使作者加上字符 依次类推
  48. #***************************************************
  49.  
  50. WebDriverWait(self.driver, 10).until(
  51. ES.presence_of_element_located((By.XPATH, "//div[@class='text']//img"))
  52. )
  53. all_img = all_content[1].xpath("//div[@class='text']//img//@src") #图片列表
  54. #解决有个张图片没有http:协议
  55. for index,item in enumerate(all_img):
  56. if 'http:' not in item:
  57. all_img[index] = 'http:'+item
  58.  
  59. dic = dict(zip(all_author,all_img)) #多个列表生产字典
  60. #遍历字典保存图片
  61. for key in dic:
  62. hz = os.path.splitext(dic[key])[1] #取出后缀名.jpg/.png
  63. filename = key+hz #文件名(标题+后缀名)
  64. urllib.request.urlretrieve(dic[key],'images/'+filename)
  65.  
  66. def main():
  67. for i in range(9):
  68. rea = Custer()
  69. rea.start()
  70.  
  71. if __name__ == '__main__':
  72. main()

 

selenium爬取煎蛋网的更多相关文章

  1. Python Scrapy 爬取煎蛋网妹子图实例(一)

    前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...

  2. python3爬虫爬取煎蛋网妹纸图片(上篇)

    其实之前实现过这个功能,是使用selenium模拟浏览器页面点击来完成的,但是效率实际上相对来说较低.本次以解密参数来完成爬取的过程. 首先打开煎蛋网http://jandan.net/ooxx,查看 ...

  3. 爬虫实例——爬取煎蛋网OOXX频道(反反爬虫——伪装成浏览器)

    煎蛋网在反爬虫方面做了不少工作,无法通过正常的方式爬取,比如用下面这段代码爬取无法得到我们想要的源代码. import requests url = 'http://jandan.net/ooxx' ...

  4. Python 爬虫 爬取 煎蛋网 图片

    今天, 试着爬取了煎蛋网的图片. 用到的包: urllib.request os 分别使用几个函数,来控制下载的图片的页数,获取图片的网页,获取网页页数以及保存图片到本地.过程简单清晰明了 直接上源代 ...

  5. python爬虫–爬取煎蛋网妹子图片

    前几天刚学了python网络编程,书里没什么实践项目,只好到网上找点东西做. 一直对爬虫很好奇,所以不妨从爬虫先入手吧. Python版本:3.6 这是我看的教程:Python - Jack -Cui ...

  6. scrapy从安装到爬取煎蛋网图片

    下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/pip install wheelpip install lxmlpip install pyopens ...

  7. python3爬虫爬取煎蛋网妹纸图片(下篇)2018.6.25有效

    分析完了真实图片链接地址,下面要做的就是写代码去实现了.想直接看源代码的可以点击这里 大致思路是:获取一个页面的的html---->使用正则表达式提取出图片hash值并进行base64解码--- ...

  8. Python Scrapy 爬取煎蛋网妹子图实例(二)

    上篇已经介绍了 图片的爬取,后来觉得不太好,每次爬取的图片 都在一个文件下,不方便区分,且数据库中没有爬取的时间标识,不方便后续查看 数据时何时爬取的,所以这里进行了局部修改 修改一:修改爬虫执行方式 ...

  9. Python 爬取煎蛋网妹子图片

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-24 10:17:28 # @Author : EnderZhou (z ...

随机推荐

  1. JavaScript DOM 高级程序设计读书笔记一

    创建可重用的对象 简而言之,对象就是包含一组变量(称为属性)和函数(称为方法)的集合的实例.对象通常由类派生而来,而类中定义了对象拥有的属性和方法.如果你的脚本中都是对象之间的交互操作,那么就可以称之 ...

  2. js 里面的各种类型转换

    1:Object 对象在转换为 number 类型时,首先会调用 valueOf 方法,然后再调用 toString 方法,否则会抛出异常. 对象在转换为 string 类型时,首先会调用 toStr ...

  3. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  4. 运行selenium脚本,报seleneium common exception.SessionNotCreatedException:Message:Unable to find a matching set of capabilities错误

  5. Kubernetes之dashboard

    部署dashboard $ wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommen ...

  6. [源码分析]AbstractStringBuilder

    [源码分析]AbstractStringBuilder Java中, AbstractStringBuilder是 StringBuilder 和 StringBuffer 的父类. 所以了解Stri ...

  7. RAID 划分

    RAID0:N块盘组成,逻辑容量为N块盘容量之和:RAID1:两块盘组成,逻辑容量为一块盘容量:RAID3:N+1块盘组成,逻辑容量为N块盘容量之和:RAID5:N块盘组成,逻辑容量为N-1块盘容量之 ...

  8. 使用antd Table + mobx 处理数组 出现的一系列问题

    在store中定义了一个数组: @observable list = [...] 若是在table组件中直接使用list: <Table className={styles.table} col ...

  9. luogu P5323 [BJOI2019]光线

    传送门 先考虑\(n=1\)的情况不是输入数据都告诉你了吗 然后考虑\(n=2\),可以光线是在弹来弹去的废话,然后射出去的光线是个等比数列求和的形式,也就是\(x_1\sum_{i=1}^{\inf ...

  10. sqlmap注入入门

    sqlmap注入入门 sqlmap的用法: ​ linux中: sqlmap [选项] ​ Windows中: python sqlmap [选项] 常用的参数及含义: 目标 ​ -d DIRECT ...