[Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录
预计阅读时间: 15分钟
环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2 (具体配置参考 http://www.cnblogs.com/yoyoketang/p/selenium.html)
FF45.2 官方下载地址: http://ftp.mozilla.org/pub/firefox/releases/45.2.0esr/win64/en-US/
痛点:爸爸的一个朋友最近简书上面更新了20多篇文章,让我添加目录。每次手动查找链接再添加标题太麻烦了,30多篇就需要半个多小时,而且链接可能会变换。
解决办法:由于简书支持markdown 格式,爬取作者目录然后生成Markdown格式文档即可
原始思路一: 采用urllib2方式爬取目录
步骤:
1.使用urllib2模拟header request打开页面
2. 采用正则匹配href的链接,然后用列表推导式生成链接
3. 采用正则获取标题
4. 生成目录
#coding=utf-8
import urllib2,re def getHtml(url):
header = {"User-Agent":'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36'}
request = urllib2.Request(url,headers=header) #init user request with url and headers
response = urllib2.urlopen(request) #open url
text = response.read()
return text def getTitleLink(html):
pattern1 = re.compile('<a class="title" target="_blank" href="/p/(\w{0,12})"', re.S)
links = re.findall(pattern1,html)
urls = ["www.jianshu.com/p/"+str(link) for link in links] pattern2 = re.compile('<a class="title" target="_blank" href="/p/.*?">(.*?)</a>',re.S)
titles = re.findall(pattern2,html)
for title,url in zip(titles,urls):
if r'目录' not in title:
print "["+title+"](" + url + ")"
#return urls #sample test menu
url = 'http://www.jianshu.com/u/73632348f37a'
html = getHtml(url)
getTitleLink(html)
测试发现如果作者文章只有五六篇,能正确生成。
但是如果文章20篇以上,发现问题:
这种办法只爬取了当前页面加载的文章链接,手工拖拽滚动条动态加载的标题内容无法直接获取到,网上建议用selenium来解决
思路二: 采用selenium打开网页,调用js模拟鼠标点击滚动条,加载全部页面
步骤:
1. 使用selenium打开网页
2. 循环调用js模拟鼠标点击下拉滚动条,直至加载全部页面
3. 使用find_elements_by_xpath查找标题tag
4. 将标题tag解析后写入目录并打印
注: 步骤3获取的为WebElement 类型对象
#coding=utf-8 #refer to http://www.cnblogs.com/haigege/p/5492177.html
#Step1: scroll and generate Markdown format Menu from selenium import webdriver
import time def scroll_top(driver):
if driver.name == "chrome":
js = "var q=document.body.scrollTop=0"
else:
js = "var q=document.documentElement.scrollTop=0"
return driver.execute_script(js) # 拉到底部
def scroll_foot(driver):
if driver.name == "chrome":
js = "var q=document.body.scrollTop=100000"
else:
js = "var q=document.documentElement.scrollTop=100000"
return driver.execute_script(js) def write_text(filename, info):
"""
:param info: 要写入txt的文本内容
:return: none
"""
# 创建/打开info.txt文件,并写入内容
with open(filename, 'a+') as fp:
fp.write(info.encode('utf-8'))
fp.write('\n'.encode('utf-8'))
fp.write('\n'.encode('utf-8')) def sroll_multi(driver,times=5,loopsleep=2):
#40 titles about 3 times
for i in range(times):
time.sleep(loopsleep)
print "Scroll foot %s time..." % i
scroll_foot(driver)
time.sleep(loopsleep) #Note: titles is titles_WebElement type object
def write_menu(filename,titles):
with open(filename, 'w') as fp:
pass
for title in titles:
if r'目录' not in title.text:
print "[" + title.text + "](" + title.get_attribute("href") + ")"
t = title.text.encode('utf-8')
t = title.text.replace(":", ":")
t = title.text.replace("|", "丨")
t = title.text.decode('utf-8')
write_text(filename, "[" + t + "](" + title.get_attribute("href") + ")")
#assert type(title) == "WebElement"
#print type(title) def main(url):
# eg. <a class="title" href="/p/6f543f43aaec" target="_blank"> titleXXX</a>
driver = webdriver.Firefox()
driver.implicitly_wait(10)
# driver.maximize_window()
driver.get(url)
sroll_multi(driver)
titles = driver.find_elements_by_xpath('.//a[@class="title"]|.//a[target="_blank"]')
write_menu(filename, titles) if __name__ == '__main__':
# sample link
url = 'http://www.jianshu.com/u/73632348f37a'
filename = r'info.txt'
main(url)
注:
1. 参考链接: http://www.cnblogs.com/haigege/p/5492177.html
2. 环境下载:Firefox45: https://ftp.mozilla.org/pub/firefox/releases/45.0esr/win64/en-US/
3. 如果编码格式报错,添加
reload(sys)
sys.setdefaultencoding('utf8')
[Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录的更多相关文章
- selenium操作下拉滚动条的几种方法
数据采集中,经常遇到动态加载的数据,我们经常使用selenium模拟浏览器操作,需要多次下拉刷新页面才能采集到所有的数据,就此总结了几种selenium操作下拉滚动条的几种方法 我这里演示的是Java ...
- python中selenium操作下拉滚动条方法汇总
UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 比如下面这样一个网页 ...
- python中selenium操作下拉滚动条方法
场景:在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 解决方法: 在python中有几种方法解决这种问题,简单介绍下,给需要的人: 方法一)使用js脚本直接操作,方法如下: #将页面滚动条拖到 ...
- [Python爬虫] Selenium +phantomjs 模拟下拉滚动条
在爬虫中,有时会遇到这种情况,数据的展示是不是一页一页的,而是通过不断的下拉滚动条来加载数据.例如一点咨询(http://www.yidianzixun.com/)和微博(在未登录的状态下:http: ...
- selenium的下拉选择框
今天总结下selenium的下拉选择框.我们通常会遇到两种下拉框,一种使用的是html的标签select,另一种是使用input标签做的假下拉框. 后者我们通常的处理方式与其他的元素类似,点击或使用J ...
- selenium之 下拉选择框Select
今天总结下selenium的下拉选择框.我们通常会遇到两种下拉框,一种使用的是html的标签select,另一种是使用input标签做的假下拉框. 后者我们通常的处理方式与其他的元素类似,点击或使用J ...
- Java+selenium 如何下拉移动滚动条【实战】
一.场景:在编写脚本过程中需要定位的元素,在界面的底部,需要拖拽下拉滚动条,再进行定位元素. 实现思路:用Selenium 里面的 scrollTo 方法实现 二.脚本示例: 1. 用例设计 @The ...
- selenium下拉滚动条
selenium下拉滚动条 制作人:全心全意 谷歌浏览器下拉滚动条 chrome = webdriver.Chrome() //创建谷歌浏览器对象 url="http://www.baidu ...
- 自动化测试-11.selenium的下拉框处理类Select
前言 最近由于工作原因,更新慢了一点,今天终于抽出一点时间给大家继续更新selenium系列,学习的脚本不能停止,希望小伙伴能多多支持. 本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关 ...
随机推荐
- jQuery和ajax【“Asynchronous Javascript And XML】
环境搭建 搭建一个jQuery的开发环境非常方便,可以通过下列几个步骤进行. 下载jQuery文件库 在jQuery的官方网站(http://jquery.com)中,下载最新版本的jQuery文件库 ...
- Centos7之pacemaker高可用安装配置详解
申明: centos7的pacemaker与6使用的方法不一致,即使用centos6.x的方法在centos7.x上面配置pacemaker不能成功. 因此openstack 上面的centos7.1 ...
- 不用第三方软件–一键开关笔记本电脑wifi热点的批处理
笔者有点洁癖啊,很强烈抵制那些辣鸡流氓软件的.用笔记本开个wifi还要装东西,搞不好给我塞一堆东西,我勒个fdkshgkhalsh,. 下面就是集设置密码与开关wifi于一身的bat,这个批处理能简化 ...
- 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)
需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换 ab 不替换 ba 不替换 aba 不替换 aab 替换为 ...
- Codis-FE配置启动
生成配置信息: ./codis-admin --dashboard-list --zookeeper= | tee conf/codis.json 如果当前目录下还没有创建logs文件夹,请先创建lo ...
- mvp设计模式
一.设计模式的简单介绍 MVP的 V 层是由UIViewController 和UIView 共同组成view 将委托presenter 对它自己的操作,(简单来说就是presenter发命令来控制v ...
- php 获取文件mime类型的方法
php 获取文件mime类型的方法 使用fileinfo需要安装php_fileinfo扩展. 如已安装可以在extension_dir目录下找到php_fileinfo.dll(windows),f ...
- Alt+~,Alt+Tab
Alt+~可以很方便的切换同一个软件中的内容. Alt+Tab可以很方便的切换不同软件之间的内容. 熟练使用,很方便.
- Windows用Eclipse来开发hadoop的WordCount的helloworld
[学习笔记] 2.Win7用Eclipse来开发hadoop的WordCount的helloworld网上下载hadoop-eclipse-plugin-2.7.4.jar,将该jar包拷贝到Ecli ...
- java中内存泄露有几种?如何分析泄露原因
一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...