机器能作的事就别让人来作!html
目标: 抓取特定微信公众号文章浏览器
思路:利用selenium模拟浏览器行为,进行抓取(理由:搜狗已将文章连接进行处理,且页面为动态生成)微信
框架:框架
步骤:ide
一、登陆搜狗url
a、找到登陆按钮并点击spa
self.browser.find_element_by_id("loginbtn").click()
此时产生一个登陆的iframe,其中还嵌套一个iframe,都是动态生成的,内嵌于该页面的另外一个新的html页面,咱们须要
定位到第二个iframe才能进行真正的登陆操做
b、定位到登陆界面的实际iframe
self.browser.switch_to.frame(0)
time.sleep(10)
self.browser.switch_to.frame("ptlogin_iframe") // ptlogin_iframe为实际登陆界面的iframe
c、 实现qq快捷登陆
利用qq实现快速登陆,前提是你已登陆本身的qq帐号,而后在页面直接点击你的qq头像便可实现登陆操做。固然,你也能够经过帐号/密码实现登陆。
self.browser.find_element_by_id("qlogin_list").find_element_by_xpath("a").click() // 找到你的qq头像对应的元素位置并点击
二、抓取文章
搜狗页面呈现方式:
抓取数据格式:
标题, 概要信息, 发布时间, 图片url, 文章实际url
经过审查元素,咱们看一下每一个文章在页面源码中的表现形式,以下图:
href连接到的是文章正文页,可是该连接并不是文章的实际连接地址,所以咱们须要点击该连接到文章正文页面获取其真实连接。
其余元数据信息则可由页面直接获取。具体获取方法,即经过find_element定位到相应元素,获取元素text信息,此处再也不
赘述。
说明一下获取文章实际url,可经过点击文章标题或图片跳转到文章页面,此时会新产生一个窗口,咱们须要切换到该窗
口,才能获取到当前的窗口URL,而后再切换回原来的窗口,继续下一个文章元数据的抓取过程,具体操做以下:
1 def get_target_url(self, no): 2 """ 3 get real url(without encryption) of target page 4 :param no: NO. 5 :return target_url: 6 :Usage: 7 """ 8 box_a = self.get_box(no).find_element_by_xpath("div[@class='txt-box']//h4//a") # 找到标题元素并点击 9 current_handle = self.browser.current_window_handle # 保留当前窗口句柄 10 box_a.click() 11 for handle in self.browser.window_handles: 12 if handle == current_handle: 13 continue 14 else: 15 # 切换到文章正文窗口,获取url后关闭,并回到主窗口 16 self.browser.switch_to_window(handle) 17 target_url = self.browser.current_url 18 self.browser.close() 19 self.browser.switch_to_window(current_handle) 20 return target_url
三、抓取更多文章code
初始页面默认呈现10篇文章,点击页面底部“查看更多”可得到更多文章,每次10篇,若到达最后,则再也不出现“查看更多”。具体作法:htm
审查元素获取“查看更多”并点击,每一个文章对应一个div,其ID形式如“sogou_vr_11002601_box_0”,末尾的0是编号,顺序递增,查看blog
更多后,可经过该ID值获取最新出现的文章。
1 def get_more(self): 2 try: 3 more = self.browser.find_element_by_class_name("p-more") 4 if more.get_attribute("style") == "visibility: hidden;": 5 return False 6 else: 7 more.find_element_by_xpath("a").click() 8 return True 9 except Exception, e: 10 print e.message
############################OVER################################
转载请注明出处!!!