算法 自动采集列表(《开源精选》之一个、Gitee等开源社区中优质项目)

优采云 发布时间: 2022-03-29 17:16

  算法 自动采集列表(《开源精选》之一个、Gitee等开源社区中优质项目)

  《开源精选》是我们在Github、Gitee等开源社区分享优质项目的专栏,内容包括技术、学习、实用和各种有趣的内容。本期推荐DrissionPage,一个基于python的开源网络自动化集成工具。

  

  使用请求作为数据采集面对要登录的网站,需要分析数据包,JS源码,构造复杂的请求,经常要处理反爬等方法如验证码、JS混淆、签名参数等,门槛较高。如果数据是JS计算生成的,计算过程必须复现,体验不好,开发效率不高。

  使用 selenium,这些坑可以在很大程度上绕过,但 selenium 效率不高。因此,该库将 selenium 和 requests 合二为一,在不同需求时切换相应的模式,并提供一种用户友好的方法来提高开发和运行效率。

  这个库除了将两者合并之外,还封装了网页中常用的函数,简化了selenium的操作和语句。用于网页自动化时,减少了对细节的考虑,专注于功能实现,使用起来更方便。一切都很简单,尽量提供简单直接的使用方法,对新手比较友好。

  功能亮点功能

  *敏*感*词*

  如图,Drission 对象负责创建链接、分享登录状态等,类似于 selenium 中驱动的概念。MixPage 对象负责对获取的页面进行解析和操作。DriverElement 和 SessionElement 是从页面对象中获取的元素对象。负责解析和操作元素。

  

  简单的演示

  与硒代码比较

  跳转到第一个标签

  # 使用 selenium:

driver.switch_to.window(driver.window_handles[0])

# 使用 DrissionPage:

page.to_tab(0)

  按文本选择下拉菜单

  # 使用 selenium:

from selenium.webdriver.support.select import Select

select_element = Select(element)

select_element.select_by_visible_text('text')

# 使用 DrissionPage:

element.select('text')

  拖动一个元素

  # 使用 selenium:

ActionChains(driver).drag_and_drop(ele1, ele2).perform()

# 使用 DrissionPage:

ele1.drag_to(ele2)

  与请求代码比较

  获取元素内容

  url = 'https://baike.baidu.com/item/python'

# 使用 requests:

from lxml import etree

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}

response = requests.get(url, headers=headers)

html = etree.HTML(response.text)

element = html.xpath('//h1')[0]

title = element.text

# 使用 DrissionPage:

page = MixPage('s')

page.get(url)

title = page('tag:h1').text

  下载文件

  url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'

save_path = r'C:\download'

# 使用 requests:

r = requests.get(url)

with open(f'{save_path}\\img.png', 'wb') as fd:

for chunk in r.iter_content():

fd.write(chunk)

# 使用 DrissionPage:

page.download(url, save_path, 'img') # 支持重命名,处理文件名冲突,自动创建目标文件夹

  爬取新冠排行榜

  URL:本例爬取全球新冠疫情排名。网站是一个纯html页面,特别适合s-mode的爬取和解析。

  

  from DrissionPage import MixPage

# 用 s 模式创建页面对象

page = MixPage('s')

# 访问数据网页

page.get('https://www.outbreak.my/zh/world')

# 获取表头元素

thead = page('tag:thead')

# 获取表头列,跳过其中的隐藏的列

title = thead.eles('tag:th@@-style:display: none;')

data = [th.text for th in title]

print(data) # 打印表头

# 获取内容表格元素

tbody = page('tag:tbody')

# 获取表格所有行

rows = tbody.eles('tag:tr')

for row in rows:

# 获取当前行所有列

cols = row.eles('tag:td')

# 生成当前行数据列表(跳过其中没用的几列)

data = [td.text for k, td in enumerate(cols) if k not in (2, 4, 6)]

print(data) # 打印行数据

  输出:

  ['总 (205)', '累积确诊', '死亡', '治愈', '现有确诊', '死亡率', '恢复率']

['美国', '55252823', '845745', '41467660', '12,939,418', '1.53%', '75.05%']

['印度', '34838804', '481080', '34266363', '91,361', '1.38%', '98.36%']

['巴西', '22277239', '619024', '21567845', '90,370', '2.78%', '96.82%']

['英国', '12748050', '148421', '10271706', '2,327,923', '1.16%', '80.57%']

['*敏*感*词*', '10499982', '308860', '9463919', '727,203', '2.94%', '90.13%']

['法国', '9740600', '123552', '8037752', '1,579,296', '1.27%', '82.52%']

......

  登录gitee 网站

  URL: ,本例演示使用浏览器控件自动登录gitee 网站。

  from DrissionPage import MixPage

# 用 d 模式创建页面对象(默认模式)

page = MixPage()

# 跳转到登录页面

page.get('https://gitee.com/login')

# 定位到账号文本框并输入账号

page.ele('#user_login').input('你的账号')

# 定位到密码文本框并输入密码

page.ele('#user_password').input('你的密码')

# 点击登录按钮

page.ele('@value=登 录').click()

  -结尾-

  开源许可证:BSD-3-Clause

  开源地址:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线