(一)  说明

上一篇只能下载一页的数据,第2、3、4....100页的数据没法获取,在上一篇的基础上修改了下,使用selenium去获取所有页的href属性值。

使用selenium去模拟浏览器有点麻烦,例如有300页就要点300次(按博客园这种一页20条,也就是6000条数据。要是几百万条,这个就得点好长时间了)

研究下有没有办法调用JS修改页面默认显示的数据条数(例如:博客园默认1页显示20条,改成默认显示1万条数据)。

(二)  完整代码

delayed.py的代码还是和之前一样。最好限速,不限速很容易被拒绝连接,而且也不道德。

 from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import StaleElementReferenceException
import time
import urllib.request as ure
from delayed import WaitFor
import lxml.html
import os
import docx
#使用selenium获取所有随笔href属性的值,url只能传小类的,例如https://www.cnblogs.com/cate/python/
def selenium_links(url):
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
#获取最大页数
maxPage = driver.find_element_by_css_selector('#paging_block div.pager a:nth-last-of-type(2)').get_attribute('text')
x=1
url_list=[]
#循环获取当前小类所有页面的href
while x<=int(maxPage):
time.sleep(1) #隐式 显式等待都尝试了,还是报错,只能等待1秒了(调试又正常运行)
x +=1
#等待 Next出现并返回 ,就是博客园翻到下一页的那个元素
lastPage = WebDriverWait(driver, 30).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '#paging_block div.pager a:last-child')))
#等待元素出现并返回list,这里定位的是页面上的随笔
html = WebDriverWait(driver, 30).until(expected_conditions.presence_of_all_elements_located((By.CSS_SELECTOR, 'a.titlelnk')))
#迭代,将href属性的值添加到url_list
for h in html:
url_list.append(h.get_attribute('href'))
lastPage.click()
driver.quit()
#以列表形式返回所有URL
return url_list
#传入包含url的列表
def link_crawler(seed_url):
html_list = []
#下载crawl_queue中的所有网页
waitFor = WaitFor(2)
x =1
while seed_url:
print('第'+str(x)+'个')
x+=1
url = seed_url.pop()
#下载限速
waitFor.wait(url)
html = download(url)
html_list.append(html)
return html_list
#下载网页并返回
def download(url,user_agent='FireDrich',num=2):
print('下载:'+url)
#设置用户代理
headers = {'user_agent':user_agent}
request = ure.Request(url,headers=headers)
try:
#下载网页
html = ure.urlopen(request).read()
except ure.URLError as e:
print('下载失败'+e.reason)
html=None
if num>0:
#遇到5XX错误时,递归调用自身重试下载,最多重复2次
if hasattr(e,'code') and 500<=e.code<600:
return download(url,num-1)
return html #将下载的网页写入Word文档
def createWord(html):
x = 0
while html:
url = html.pop()
tree = lxml.html.fromstring(url) # 解析HTML为统一的格式
title = tree.xpath('//a[@id="cb_post_title_url"]') # 获取标题
the_file = tree.xpath('//div[@id="cnblogs_post_body"]/p') # 获取正文内容
pre = tree.xpath('//pre') # 获取随笔代码部分(使用博客园自带插入代码功能插入的)
img = tree.xpath('//div[@id="cnblogs_post_body"]/p/img/@src') # 获取图片
# 修改工作目录
os.chdir('F:\Python\worm\data\博客园文件')
try:
# 创建一个空白新的Word文档
doc = docx.Document()
# 添加标题
doc.add_heading(title[0].text_content(), 0)
#有的设置成注册用户才能浏览的随笔,调用download函数时下载不到正确的网页,导致获取不到标题
#title会是空列表,这里忽略这篇随笔,利用http.cookiejar模块应该可以解决这种问题,以后再看看这个模块了
except IndexError as e:
continue
for i in the_file:
# 将每一段的内容添加到Word文档(p标签的内容)
doc.add_paragraph(i.text_content())
# 将代码部分添加到文档中
for p in pre:
doc.add_paragraph(p.text_content())
# 将图片添加到Word文档中
for i in img:
try:
ure.urlretrieve(i, '0.jpg')
doc.add_picture('0.jpg')
except UnicodeEncodeError as e:
print('异常'+str(e))
pass
# 截取标题的前8位作为Word文件名
filename = title[0].text_content()[:8] + '.docx'
# 保存Word文档
# 如果文件名已经存在,将文件名设置为title[0].text_content()[:8]+ str(x).docx,否则将文件名设置为filename
if str(filename) in os.listdir('F:\Python\worm\data\博客园文件'):
doc.save(title[0].text_content()[:8] + str(x) + '.docx')
x += 1
else:
doc.save(filename)
#调用selenium_links获取所有url
html = selenium_links('https://www.cnblogs.com/cate/ruby/')
#调用link_crawler下载所有网页
downHtml = link_crawler(html)
#提取已经下载的网页数据到Word文档中
createWord(downHtml)

(三)结果

下面这个异常是,有的随笔上传了微信公众号的图片(暂时不确定是全部这样,还是部分这样),解析这个的时候会出现编码错误,目前的处理是输出异常信息,跳过这张图片。

Python网络爬虫笔记(四):使用selenium获取动态加载的内容的更多相关文章

  1. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

  2. Golang 网络爬虫框架gocolly/colly 五 获取动态数据

    Golang 网络爬虫框架gocolly/colly 五 获取动态数据 gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goque ...

  3. python网络爬虫之自动化测试工具selenium[二]

    目录 前言 一.获取今日头条的评论信息(request请求获取json) 1.分析数据 2.获取数据 二.获取今日头条的评论信息(selenium请求获取) 1.分析数据 2.获取数据 房源案例(仅供 ...

  4. Python网络爬虫笔记(二):链接爬虫和下载限速

    (一)代码1(link_crawler()和get_links()实现链接爬虫) import urllib.request as ure import re import urllib.parse ...

  5. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  6. 爬虫:获取动态加载数据(selenium)(某站)

    如果网站数据是动态加载,需要不停往下拉进度条才能显示数据,用selenium模拟浏览器下拉进度条可以实现动态数据的抓取. 本文希望找到某乎某话题下讨论较多的问题,以此再寻找每一问题涉及的话题关键词(侵 ...

  7. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  8. 爬虫--selenuim和phantonJs处理网页动态加载数据的爬取

    1.谷歌浏览器的使用 下载谷歌浏览器 安装谷歌访问助手 终于用上谷歌浏览器了.....激动 问题:处理页面动态加载数据的爬取 -1.selenium -2.phantomJs 1.selenium 二 ...

  9. Python网络爬虫实战(四)模拟登录

    对于一个网站的首页来说,它可能需要你进行登录,比如知乎,同一个URL下,你登录与未登录当然在右上角个人信息那里是不一样的. (登录过) (未登录) 那么你在用爬虫爬取的时候获得的页面究竟是哪个呢? 肯 ...

随机推荐

  1. dubbo-常用配置

    一.启动时检查 官网说明: Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true&q ...

  2. Android之混淆心得与亲身体验

    project.properties 中设置 proguard.config=proguard-project.txt proguard-project.txt  中设置 -optimizationp ...

  3. CentOS 6.9上inotify-tools 安装及使用方法

    文章目录 [隐藏] 一.检查系统内核版本 三.下载安装(下载有点慢) 四.查看inotify默认参数 五.修改inotify参数 六.创建实时监控脚本 (file 里面放的需要监听的目录) 七:实例操 ...

  4. linux 设置与网络同步的时间

    #设置linux时间 与网络时间同步安装命令yum install -y ntp同步网络时间ntpdate ntp1.aliyun.com

  5. RedHat Linux下MQ安装步骤及MQ常用命令

    1.检查操作系统及内存情况:lsb_release -a; 2   检查java 环境:java -version 3   新建用户空间.用户和组: //创建用户目录 mkdir /home/mqm ...

  6. openerp7 时区问题解决--改成本地时区

    由于目前openerp的时区,读取的是UTC时间,而我国本地时间比UTC快8小时 问题就导致,写入数据库的时候时间相差8小时,以及Openerp日志输出时间格式也相差8小时和前端显示问题 1.更改op ...

  7. niftynet Demo分析 -- brain_parcellation

    brain_parcellation 论文详细介绍 通过从脑部MR图像中分割155个神经结构来验证该网络学习3D表示的效率 目标:设计一个高分辨率和紧凑的网络架构来分割体积图像中的精细结构 特点:大多 ...

  8. .34-浅析webpack源码之事件流make(3)

    新年好呀~过个年光打游戏,function都写不顺溜了. 上一节的代码到这里了: // NormalModuleFactory的resolver事件流 this.plugin("resolv ...

  9. linux中使用Crontab定时执行java的jar包无法使用环境变量的问题

    1.crontab简单使用 cmd 其实就是5个星星的事情,随便百度一下吧 5个时间标签用来标注执行的设定.比如每5分钟执行一次/5 * * * cmd 要特别注意 2.有些命令在命令行里执行很好,到 ...

  10. WEB控件没有什么所谓好不好,而是用得好不好

    这几天Insus.NET有写几篇博文,虽然写得没怎么样,但均是Insus.NET现实开发过程中所遇或是所想的一些内容.<没有什么,开发ASP.NET时随便写写,想到什么写什么>http:/ ...