freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

好玩的爬虫小玩意(6)----爬虫扩展及分布式爬虫了解
gingingg 2022-01-08 12:29:54 264776
所属地 山西省

一.爬虫拓展

1.BeautifulSoup

bs其实就是py中的一个库,但是其简单运用的方法,成为了爬虫的一大利器,只需要很简单的语句就可以从网页中爬取相应的信息,也不用考虑转码的问题,bs自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。

以下是简单的bs语句:

from bs4 import BeautifulSoup as e
import urllib.request
data=urllib.request.urlopen("目标网站").read().decode("utf-8",ignore)
bs1=bs(data)
#格式化输出
#print(bs1.preetify())

#获取标签:bs对象.标签名
bs.title

#获取标签中的文字:bs对象.标签名.string
bs1.title.string

#获取标签名:bs对象.标签名.name
bs1.title.name

#获取属性列表:bs对象.标签名.attrs
bs1.a.attrs

#获取某个属性对应的值:bs对象.标签名[属性名] 或 bs对象.标签名.get(属性名)
bs1.a["class"]
bs1.a.get("class")

#提取某个节点的内容:bs对象.find_all('标签名') bs对象.find_all(['标签名1','标签名2'......'标签n'])
bs1.find_all('a')
bs1.find_all(['a','ul'])

#提取所有字节点:bs对象.标签.contents bs对象.标签.children
k1=bs1.ul.contents
k2=bs1.ul.children
allulc=[i for i in k2]

当我们使用提取子节点的时候,有两种方法:利用contents直接输出,或者利用children建成对象输出。

image-20211222203801792

image-20211222203838814

对bs感兴趣的兄弟可以去官方文档查看:http://beautifulsoup.readthedocs.io/zh_CN/latest/

2.PhantomJS

PhantomJS俗称为无界面的浏览器,PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,虽然PhantomJS搜索效率并不是很高,但是通过PhantomJS可以解决很多反爬问题,通常可以将难点交给PhantomJS去处理,之后将数据交给urllib或Scrapy进行后续处理。

例如有时我们进行爬虫会需要首先触发网页之后才能进行下一步的爬取,此时利用PhantomJS就可以很好的应对反爬,之后将返回的数据转交给爬虫模块进行处理即可。

首先访问phantomjs官网进行下载:

image-20211222210120809

之后到bin目录就可以找到exe直接使用了;

image-20211222210253781

利用pip 命令安装selenium模块;

image-20211222210615224

利用代码(附注释):

import time
from selenium import webdriver
browser = webdriver.PhantomJS()    #调用webdriver中的phantomjs来生成浏览器
browser.get("http://www.baidu.com")     #模拟浏览器访问百度
a=browser.get_screenshot_as_file("图片目录")    #将访问的浏览器界面截图爬取出来
browser.find_element_by_xpath('//*[@id="kw"]').clear()      #利用xpath表达式找出搜索框并利用clear将其清空
browser.find_element_by_xpath('//*[@id="kw"]').send_keys("爬虫")      #将所搜索的数据利用send_keys输入
browser.find_element_by_xpath('//*[@id=su]').click()        #利用click点击搜索按钮
time.sleep(5)       #等待时间5
a=browser.get_screenshot_as_file("图片目录")        #将搜索结果界面截图保存可以查看是否成功
data=browser.page_source        #将本界面内的源代码保存
browser.quit()      #关闭浏览器
print(len(data))        #查看data(爬取网页源码的长度)验证是否爬取成功
import re
title=re.compile("<title>(.*?)</title>").findall(data)      #提取data中title的数据
print(title)

注:get_screenshot_as_file是很常用的,来验证我们运行的操作是否成功,可以没进行一步操作添加一个截图来验证。

***clear,send_key(),click()***三个参数也是browser中很常用的,应该理解意思,常用就可以熟练了

另外,在查看xpath语句的时候,也可以f12之后利用查看器选择对应的部位,右键copy就可以选择直接提取xpath语句了。

image-20211223170328959

二.分布式爬虫讲解

利用多台机器同时进行实现爬虫任务,这么多个爬虫,整体称为分布式爬虫,可知,分布式爬虫时区别于单机爬虫的一种架构。

分布式爬虫难点在于多个爬虫之间的通信,其实应用的技术与之前学习的爬虫无区别,但是就是应用的环境不同,效率不同。

1.常见分布式爬虫架构技术

  • 1.多台真实机器+爬虫(如Urllib,scrapy等)+任务共享中心

  • 2.多台虚拟机器(或者部分虚拟部分真实)+爬虫(如Urllib,Scrapy等)+任务共享中心

  • 3.多台容器级虚拟化机器(或者部分真实机器)+爬虫(如Urllib,Scrapy等)+任务共享中心

常见任务共享中心可以采用redis技术进行实现;

存储数据时,也可以存储在节点中或者直接存储到中心机器的数据库中;

进行虚拟容器技术选择的时候也可以使用我们最熟悉的docker进行实现。

所以常见的实现技术手段有:

  • 1.Docker+Redis+Urllib+(Mysql)

  • 2.Docker+Redis+Scrapy-Redis+(Mysql)

容器技术+共享中心技术+爬虫框架+数据库技术

当我们利用多台机器进行爬虫的时候,任务共享中心会对于任务进行情况进行统计,执行一个任务的时候会查看其他任务执行情况与此任务执行效果。

使用多个机器进行分布式爬虫 :

image-20211225171057803

使用虚拟容器进行分布式爬虫构建(对于内存占比相对于较低):

image-20211227183650629

对于爬虫的学习就暂时告一段落了,本来想详细讲一下分布式爬虫的实现方法的,但是一想可能我们平时用不太上,毕竟不用爬虫去找工作,所以大型的爬虫项目也不会做,所以做一下原理性的讲解即可,兄弟们知道原理即实现方法就行了,多余不多做讲解,其他的文章我也放到了我的专辑中,兄弟们多多捧场。这个系列就到这里。感谢大家的支持。

# python # 爬虫
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 gingingg 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
好玩的爬虫
gingingg LV.4
不定时更新
  • 13 文章数
  • 17 关注者
GlodenEye-v1黄金眼靶场复现
2022-11-25
Dockerfile搭建靶场与Docker技巧
2022-11-09
渗透测试之路:WebLogic中间件漏洞复现
2022-01-13