网络爬虫实践小结

背景

近期工作中要解决两个问题,一个是数据组需要网爬一些图片数据,另外一个是要批量爬取公司用于文档协同的一个网站上的附件。于是乎,就写了两个脚本去完成任务。

爬虫思路

第一步:向确定的url发送请求,接收服务器的响应信息;如果是需要用户登录的网页,需要手动获取cookie信息放入header中,或者模拟登录自动获取cookie。

第二步:对接收到的信息进行解析,找到需要的标签内容(通常是我们需要的图片或文件的url);

第三步:向目标url发送请求,保存数据到本地。

python在网络爬虫方面提供了一些框架,Scrapy、Pyspider等,由于我们要实现的都是小功能,用一些现成的库即可。

爬取附件

1、发送简单请求用urllib.request.urlopen(url)就可以了,但如果要加入headers则可用urllib.request.Request类构造一个request实例,再调用urlopen发送请求。如要用到cookie:

(如果要实现模拟登录自动获取cookie,可参考爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆-CSDN博客)

import urllib.requestheaders = {"Cookie": 'confluence.list.pages.cookie=list-content-tree;.......'}req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
2、解析响应体,这里是要找到附件链接的图标,在html中是<a class="filename">的标签元素。用到BeautifulSoup。
from bs4 import BeautifulSouphtml = response.read().decode("utf8")
soup = BeautifulSoup(html, "lxml")
a_list = soup.find_all("a")
for a in a_list:if "class" in a.attrs:if "filename" in a["class"]:filename = a.text.strip()download_url = a['href']print(download_url)           
3、获得文件下载地址后,发送请求,将返回的响应保存到本地即可。这里发请求用的requests库,用urllib.request应该也可以。
import requestsfile = requests.get(download_url, headers=headers)
save_path = './download/'
if not os.path.exists(save_path):os.mkdir(save_path)
save_file = open(os.path.join(save_path, filename), 'wb')
save_file.write(file.content)
save_file.close()
print('save ok')
遗留问题:

上述脚本可针对特定网页进行附件爬取,但多个网页如何先获取到所有网页地址是个棘手的问题。目前只能通过搜寻url规律,发现里面的pageId是9位数字字符,大概确定了范围,进行暴力遍历。

爬取图片

网上关于百度、google爬取关键字图片的开源代码很多,我也是找了一个开源代码进行稍微修改,目前满足实际需要。这里附上代码,供参考。

# -*- coding: UTF-8 -*-"""
import requests
import tqdm
import os
import jsondef configs(search, page, number):url = 'https://image.baidu.com/search/acjson'params = {"tn": "resultjson_com","logid": "11555092689241190059","ipn": "rj","ct": "201326592","is": "","fp": "result","queryWord": search,"cl": "2","lm": "-1","ie": "utf-8","oe": "utf-8","adpicid": "","st": "-1","z": "","ic": "0","hd": "","latest": "","copyright": "","word": search,"s": "","se": "","tab": "","width": "","height": "","face": "0","istype": "2","qc": "","nc": "1","fr": "","expermode": "","force": "","pn": str(60 * page),"rn": number,"gsm": "1e","1617626956685": ""}return url, paramsdef loadpic(number, page, path):while (True):if number == 0:breakurl, params = configs(search, page, number)try:response = requests.get(url, headers=header, params=params).content.decode('utf-8')result = json.loads(response)url_list = []for data in result['data'][:-1]:url_list.append(data['thumbURL'])for i in range(len(url_list)):getImg(url_list[i], 60 * page + i, path)bar.update(1)number -= 1if number == 0:breakpage += 1except Exception as e:print(e)continueprint("\nfinish!")def getImg(url, idx, result_path):img = requests.get(url, headers=header)file = open(result_path + str(idx + 1) + '.jpg', 'wb')file.write(img.content)file.close()if __name__ == '__main__':search = "溜冰" # 爬取的关键词number = 100    #爬取的目标数量result_path = os.path.join(os.getcwd(), search)if not os.path.exists(result_path):os.mkdir(result_path)header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}bar = tqdm.tqdm(total=number)page = 0loadpic(number, page, result_path)

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

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

相关文章

[小林coding]4.2TCP重传,滑动窗口,流量控制,拥塞控制_1013

1.重传 1.1 超时重传 两个情况&#xff1a; a 数据包丢失 b ack应答丢失 RTT&#xff1a;网络包往返的时间&#xff08;不是一个定值&#xff09; RTO&#xff1a;超时重传的时间间隔&#xff08;也是一个动态的&#xff09; RTO设置的时间长&#xff1a;浪费时间资源&…

grafana api创建dashboard 记录

文章目录 json model导入申请api key创建dashboard删除dashboard json model导入 直接在ui通过json model 导入&#xff0c;开发自己用还好&#xff0c;但对非开发人员不太友好&#xff0c;故考虑通过api后台自动创建 api doc : https://grafana.com/docs/grafana/v9.3/devel…

AR动态贴纸SDK,让创作更加生动有趣

在当今的社交媒体时代&#xff0c;视频已经成为了人们表达自我、分享生活的重要方式。然而&#xff0c;如何让你的视频在众多的信息中脱颖而出&#xff0c;吸引更多的关注和点赞呢&#xff1f;答案可能就在你的手中——美摄AR动态贴纸SDK。 美摄AR动态贴纸SDK是一款专为视频编辑…

R语言——赋值(= ,<- ,<<-)

R语言 R语言——赋值&#xff08; &#xff0c;<- &#xff0c;<<-&#xff09; 文章目录 R语言一、 与 <- 的区别二、 <<- ,向上一环境层写入变量 R语言中" <- " 与 " " 都可以用来赋值&#xff0c;但R中建议使用" <- “…

ESP32网络开发实例-UDP数据发送与接收

UDP数据发送与接收 文章目录 UDP数据发送与接收1、UDP简单介绍2、软件准备3、硬件准备4、代码实现本文将详细介绍在Arduino开发环境中,如何实现ESP32通过UDP协议进行数据发送与接收。 1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传…

Linux开发工具:vim的介绍和用法及其简单配置

前言 Vim 简介. 编辑. Vim是从 vi 发展出来的一个文本编辑器。. 代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用&#xff0c;和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。. [1] vim的设计理念是命令的组合。. 用户学习了各种各样的…

【统计学概念】初学者指南:了解置信区间

一、说明 什么是置信区间&#xff1f;如何将概率转化成信心度&#xff1f;信心度如何去工作&#xff1f;这些初步的统计概念需要明晰&#xff0c;然后才能应用统计模型&#xff0c;然后是贝叶斯推理&#xff0c;我们将逐步深入这些概念。 二、总体与样本个体统计 总体是研究人…

【Unity】【VR】详解Oculus Integration输入

【背景】 以下内容适用于Oculus Integration开发VR场景,也就是OVR打头的Scripts,不适用于OpenXR开发场景,也就是XR打头Scripts。 【详解】 OVR的Input相对比较容易获取。重点在于区分不同动作机制的细节效果。 OVR Input的按键存在Button和RawButton两个系列 RawButton…

比较和同步数据库架构和数据:MssqlMerge Pro Crack

比较和同步数据库架构和数据 适用于Oracle、MySQL 和 MariaDB、SQL Server、PostgreSQL、SQLite、MS Access和跨 DBMS 场景 业界领先的文本比较工具中常用的两面板 UI 快速过滤器显示所有/新/更改/新更改 合并两个方向的更改 轻量级&#xff1a;跨 DBMS 工具小于 20 MB&#xf…

数据结构之手撕顺序表(增删查改等)

0.引言 在本章之后&#xff0c;就要求大家对于指针、结构体、动态开辟等相关的知识要熟练的掌握&#xff0c;如果有小伙伴对上面相关的知识还不是很清晰&#xff0c;要先弄明白再过来接着学习哦&#xff01; 那进入正题&#xff0c;在讲解顺序表之前&#xff0c;我们先来介绍…

代码随想录——图论一刷day03

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣130. 被围绕的区域二、力扣417. 太平洋大西洋水流问题三、力扣827. 最大人工岛 前言 一、力扣130. 被围绕的区域 class Solution {boolean[][] flag;i…

JavaScript-es6-新版语法-export-import

文章目录 1.export2.import3.export default 命令4.总结 在JavaScript ES6中&#xff0c;export与export default均可用于导出常量、函数、文件、模块等。模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输…

接口测试文档

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

鸿蒙tabbar ArkTS

鸿蒙tabbar ArkTS 做了仿照现在应用的做了一个tabbar。 官方文档地址 参考文档 tabbar 其中有个比较重要的点是&#xff0c;对image资源的引用问题。 资源相关说明 图片是resources目录下的base目录下的。 media目录下的图片的资源不能添加文件夹&#xff0c;只能是文件&a…

树模型(一)孤立森林

孤立森林&#xff08;Isolation Forest&#xff09;算法是西瓜书作者周志华老师的团队研究开发的算法&#xff0c;一般用于结构化数据的异常检测。 异常的定义 针对于不同类型的异常&#xff0c;要用不同的算法来进行检测&#xff0c;而孤立森林算法主要针对的是连续型结构化…

适用于 Golang 的任务调度程序 AGScheduler

以前一直使用 Python 的任务调度库 APScheduler&#xff08;支持任务持久化&#xff0c;支持多种存储方式&#xff09;&#xff0c;但由于没有找到和它功能和使用方式类似的 Golang 库&#xff0c;所以模仿 APScheduler 3.x 写了个简易版本的 AGScheduler。 AGScheduler Advan…

近地面无人机植被定量遥感与生理参数反演

目录 专题一 近十年近地面无人机植被遥感文献分析、传感器选择、观测方式及质量控制要点 专题二 辐射度量与地物反射特性 专题三 无人机遥感影像辐射与几何处理 专题四 光在植被叶片与冠层中的辐射传输机理及平面模型应用 专题五 植被覆盖度与叶面积指数遥感估算 更多应用…

【LeetCode】21. 合并两个有序链表

1 问题 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&…

【Node.js】路由

基础使用 写法一&#xff1a; // server.js const http require(http); const fs require(fs); const route require(./route) http.createServer(function (req, res) {const myURL new URL(req.url, http://127.0.0.1)route(res, myURL.pathname)res.end() }).listen…

毕业设计选题Java+springboot校园新闻资讯系统源码 开题 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…