Python + Selenium: 爬取某社交门户网站新闻栏目焦点

news/2024/5/21 7:10:57/文章来源:https://blog.csdn.net/qq_21264377/article/details/108197113

以前通过直接获取的HTML文本内容分析过,但是明显毫无结果。彼时深切体会到要想测试爬取“普通”反爬虫策略级别以上的网站内容,必须从浏览器内核级别入手。因为只有彻底模拟浏览器的行为,才无法被机器人100%识别为爬虫而遭到限制或拒绝服务。“爬虫”与“反爬虫”是一对相互对立的矛盾,也是互相促进的因素。

话说回来,该网站是国内某知名社交网站发家的,在中国互联网历史也算是较早的。每年毕业季,都会有大量毕业生“挤破头”想要通过层层面试进入该网站企业。这样的历史背景应该有相当的技术沉淀。适合练习尝试。那接下来,就开始咯。

前期准备工作依然是,调查分析该社交网站的“反爬虫”策略。

浏览目标:

浏览目标

这个页面是延时加载的。而且, 往下滚动页面至底部时,会刷新底部追加新的新闻消息内容。
查看HTML源码:

目标HTML源码

HTML源码只有短短80多行, 没有包含任何新闻消息相关内容。由此证实,目标网页是通过javascript延时异步加载的AJAX模式。这对爬虫来是“不友好”的,鉴此评级该目标为“普通”或“严格”级别反爬虫策略。

现在,进行解析目标的HTML体系结构。利用浏览器的“检查元素”功能,解读目标HTML。(这里使用的Chrome,其它如Firefox等selenium支持的浏览器均可)以前Firefox上著名的firebug插件是非常有用的工具,现在该插件似乎已停止更新,主流浏览器都已拥有类似内置功能。

目标体系结构2-1

从上图可以看出,所要提取的焦点内容在一个list列表 – ul标签,class名为:“list”。

在这里插入图片描述

而ul的li的内容如上图所示,标题包含在一个a标签。a标签里包含了一些注释符(绿色字体)。需要特别处理一下,可以利用正则表达式匹配出来,逐个去除:

comment_pattern='<!--[^<>]*-->'
comments=re.findall(comment_pattern, target_html)
for comment in comments:# 替换为空白符target_html=target_html.replace(comment, '')

按照流程来看,就是:
等待目标主体加载 -> 获取目标主体节点 -> 解析目标列表 -> 遍历列表解析目标详细 -> 生成目标实体集合
设计代码:

# -*- coding: utf-8 -*-
#!/usr/bin/env python"""
@author: WowlNAN@github: https://github.com/WowlNAN@blog: https://blog.csdn.net/qq_21264377"""
"""
Get news list of target
"""import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECS
from htmldom import *
import re
import sys
from schedule import *class Solution:def __init__(self):self.url=''# headless#self.options=Options()#self.options.add_argument("--headless")#self.options.add_argument("--disable-gpu")#self.driver=webdriver.Chrome(chrome_options=self.options)self.driver=webdriver.Chrome()self.caches={}self.path=Nonedef __delete__(self):self.url=Noneself.caches=Noneself.path=''            if self.driver:self.driver.close()self.driver=Noneif self.options:self.options=Nonedef reset(self):self.url=''self.caches={}self.path=Nonedef dictcache(self, title: str, url: str):if self.caches.get(title, '')=='':self.caches[title]=urldef pickcaches(self, htmls: str):for html in htmls:# 是否包含注释标签if '<!--' in html:comments=re.findall('<!--[^<>]*-->', html)if comments and len(comments)>0:for comment in comments:html=html.replace(comment, '')# 目标标题title=re.findall('>([^<>]+)</a>', html, re.I|re.S|re.M)# 目标链接link=re.findall('href="([^<>"]+)"', html, re.I|re.S|re.M)if title and link and len(title)>=1 and len(link)>=1:self.dictcache(title[0], link[0])def getcaches(self, url: str):if not url:return Noneelif not url.strip():return Noneelif not url.startswith('http://') and not url.startswith('https://'):return Noneif self.driver:self.reset()else:self.__init__()starttime=time.time()self.path=url.split('/')[-1].split('.')[0]self.driver.get(url)wait=WebDriverWait(self.driver, 5)time.sleep(1)        # 目标主体列表ul标签    targetelement=wait.until(ECS.presence_of_element_located((By.CSS_SELECTOR, 'ul[class="list"]')))if not targetelement or targetelement==[]:return Nonehtml=targetelement.get_attribute('innerHTML')if not html:return#print(html)# 目标列表titlehtmls=match('//li//div:class=detail//h3//a', html)if not titlehtmls:return            self.pickcaches(titlehtmls)codes={'count':0, 'hit':0, 'done':0, 'failed':0, 'lost':0, 'time':0}                          endtime=time.time()if len(self.caches.keys())>0:for key in self.caches.keys():print(key, self.caches.get(key, ''))sys.stdout.flush()codes['done']=len(self.caches.keys())codes['time']=str(int(endtime-starttime))+'s'keys='|'actions='|'l=len(codes.keys())i=0gridwidth=12for key in codes.keys():kl=gridwidth-len(key)keys+=' '*(kl//2)+key+' '*(kl-kl//2)al=gridwidth-len(str(codes[key]))actions+=' '*(al//2)+str(codes[key])+' '*(al-al//2)i+=1if i>0:keys+='|'actions+='|'print('\r|'+('-'*gridwidth+'|')*l, end='\n')print(keys)print('|'+('-'*gridwidth+'|')*l)print(actions)print('|'+('-'*gridwidth+'|')*l)testdatas=[]
s=Solution()
#s.getimages(testdatas[-1])
print("ENTER:[eg, http://a.com/b/c.html]")
url=' '
while url:if url:s.getcaches(url)time.sleep(.2)s.reset()url=input(">>")

执行结果:

执行结果

笔记:

根据博主的经验,如果单解析其Javascript脚本的内容,应该可能会发现标题是一些中文的unicode编码,而且Javascript脚本会有一些混淆措施,故该社交网站应该是“严格”反爬虫策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_794509.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多层次应对HTTPS网站超时:selenium.common.exceptions.TimeoutException

现在网络越来越普及&#xff0c;带宽速度普遍也有较大提升。伴随网络的普及&#xff0c;同时快速增长的还有网民的数量和网络流量。网站超时响应的“通病”&#xff0c;仍然是无法完全避免的。尤其是在网络流量高峰期访问HTTPS网站&#xff0c;使用类似Selenium的浏览器内核驱动…

阿里云轻量服务器部署PHP网站(基于Lamp)

一&#xff1a;首先登陆阿里云账户购买轻量服务器&#xff08;这里就不详细介绍啦&#xff09;【轻量服务器会提供PHP,Apache,Mysql,不需要我们自己安装&#xff0c;方便很多】 如果是选择阿里云ecs服务器的话可以参考&#xff1a;https://blog.csdn.net/qiaosym/article/deta…

[转载]使用IntelliJ IDEA开发SpringMVC网站(一)开发环境

访问GitHub下载最新源码&#xff1a;https://github.com/gaussic/Sp... 文章已针对IDEA 2016做了一定的更新&#xff0c;部分更新较为重要&#xff0c;请重新阅读文章并下载最新源码。另外&#xff1a;文中的附图部分仍然为旧版本&#xff0c;请参照自身版本进行配置。 前言 由…

ASP.NET 2.0中轻松实现网站换肤

&#xff1a; 查看个人网站 查看详细资料 &#xff1c;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#xff1e; &#xff1c;html xmlns"http://www.w3.org/1999/xh…

JQuery 的跨域方法 可跨任意网站

因发现有不少博友发园内短信问及JS的跨域问题&#xff0c;我想很多程序员的脑海里面还认为JS是不能跨域的&#xff0c;其实这是一个错误的观点&#xff1b;有很多人在网上找其解决方法&#xff0c;教其用IFRAME去解决的文章很多&#xff0c;真有那么复杂吗&#xff1f;其实很简…

推荐一个可以往blog里面加入旅行线路图的travel map网站

今天无意中发现这个网站&#xff0c;Free Travel Map Widget&#xff0c;可以很方便的做一个travel map&#xff0c;然后生成html代码放到blog里面。效果可以看看我之前的泰国和欧洲的blog更新&#xff0c;加了map。转载于:https://www.cnblogs.com/fresky/archive/2010/11/03/…

高性能网站建设之减少Http连接数

关于CSS背景图合并工具&#xff0c;请大家参看随笔&#xff1a;Css背景图合并工具功能增强&#xff08;V0.1&#xff09; 在对大访问量网站进行性能优化时&#xff0c;其中有一点是尽量减少http连接数&#xff0c;道理很明了&#xff0c;减少了单个PV的http连接数&#xff0c;…

通过脚本方式导出SharePoint网站集用户及其角色列表

这是课堂上的一个例子&#xff0c;分享出来给大家参考用。如果你管理一个或者多个网站集&#xff0c;那么这个脚本将有助于你快速地了解用户信息。 管理员们&#xff0c;懂点脚本还是很有用的哦&#xff0c;呵呵 将下面的脚本保存为一个ps1文件function Get-UsersWebPermission…

php与mysql网站开发..._Mysql 与 php动态网站开发 入门教程,mysql网站开发_PHP教程...

Mysql 与 php动态网站开发 入门教程&#xff0c;mysql网站开发这个系列的教程由表单开始写&#xff0c;因为表单可以把数据库和web 之间的交互表现得很明显。提交表单 &#xff0c;数据库记录注册信息。本教程属于基础教程。大神请略过。对于php和mysql之间的稳固性很受程序员的…

linode服务器登录网站,linode 服务器

linode 服务器 内容精选换一换云服务器组是对云服务器的一种逻辑划分&#xff0c;云服务器组中的弹性云服务器遵从同一策略。当前仅支持反亲和性&#xff0c;即同一云服务器组中的弹性云服务器分散地创建在不同的主机上&#xff0c;提高业务的可靠性。您可以使用云服务器组将业…

黑人抬棺html网站源码

黑人抬棺html源码 成品地址&#xff1a;https://www.52fenxiang.top/hrtg/ 源码下载地址&#xff1a;https://www.52fenxiang.top/thread-448-1-1.html

用DIV+CSS的网页布局对SEO的好处

为什么80%的码农都做不了架构师&#xff1f;>>> DIVCSS是网站标准&#xff08;或称“WEB标准”&#xff09;中常用术语之一&#xff0c;通常为了说明与HTML网页设计语言中的表格&#xff08;table&#xff09;定位方式的区别&#xff0c;因为XHTML网站设计标准中&a…

最新70佳单页网站设计案例欣赏(下篇)

单页网站是指只有一个页面的网站&#xff0c;这种形式的网站曾经非常流行&#xff0c;现在依然有很多人喜欢。不过&#xff0c;并不是每个网站都适合做成单页&#xff0c;一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站&#xff0…

在线压缩图片网站源码

今天分享给小伙伴一份在线压缩图片的网站源码&#xff0c;也算是比较实用的一份源码&#xff0c;测试地址我会贴在【效果展示】段落下面&#xff0c;喜欢的小伙伴自行下载吧。 #效果展示 效果展示&#xff1a;图片在线压缩效果展示 来自&#xff1a;12580code源码站

表白网站源码-html源码

#源码介绍 一份表白网站源码&#xff0c;里面用到的一些小技巧还是可以学习的&#xff0c;需要用的的小伙伴可以拿去用哈&#xff0c;下载完成后打开index.html&#xff0c;然后修改文本和修改图片就可以啦&#xff0c;小二在这祝你们成功哦&#xff08;哈哈哈哈哈哈&#xff0…

对SEO优化有一定作用的DIV+CSS命名规则

为什么80%的码农都做不了架构师&#xff1f;>>> SEO(搜索引擎优化)有很多工作要做&#xff0c;其中对代码的优化是一个很关键的步骤。为了更加符合SEO的规范&#xff0c;下面中部IT网将对目前流行的CSSDIV的命名规则整理如下&#xff1a; 页头:header 登录条:login…

CJC(一): ToStringBuilder两种方法用法优缺点及一个问题 - rmn190 - ITeye技术网站

CJC(一): ToStringBuilder两种方法用法优缺点及一个问题 - rmn190 - ITeye技术网站CJC(一): ToStringBuilder两种方法用法优缺点及一个问题 博客分类&#xff1a;Source Codes Study设计模式F#Security CJC是Common Java Cookbook的缩写, 这是一本介绍ApacheCommon开源项目的电…

大型网站架构演变的知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

大流量网站的底层系统架构

为什么80%的码农都做不了架构师&#xff1f;>>> 动态应用&#xff0c;是相对于网站静态内容而言&#xff0c; 是指以c/c、php、Java、perl、.net等 服务器端语言开发的网络应用软件&#xff0c;比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通 常与数据…

windows8 安装IIS 和 添加网站(转)

Internet Information Services&#xff08;IIS&#xff0c;互联网信息服务&#xff09;&#xff0c;是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包&#xff0c;随后内置在Windows 2000、Windows XP Professional和Windows Serv…