勾八头歌之数据科学导论—数据采集实战

一、数据科学导论——数据采集基本概念

第1关:巧妇难为无米之炊

第2关:数据采集概念与内涵

二、数据科学导论——数据采集实战

第1关:单网页爬取

import urllib.request
import csv
import re# ********** Begin ********** #
data=urllib.request.urlopen("http://www.jd.com").read().decode("utf-8","ignore")
#打开京东,读取并爬到内存中,解码, 并赋值给data
urllib.request.urlretrieve("http://www.jd.com",filename="./step1/京东.html")
#打开京东,读取保存到本地
# ********** End ********** #    
# ********** Begin ********** #
#正则表达式(Regular Expression)
pattern="<title>(.*?)</title>"
#re.compile()指编译正则表达式
#re.S是模式修正符,网页信息往往包含多行内容,re.S可以消除多行影响
title=set(re.compile(pattern,re.S).findall(data))
#保存数据到csv文件中
with open("./step1/csv_file.csv", 'w') as f:f_csv = csv.writer(f)f_csv.writerow(title)
# ********** End ********** #

第2关:网站爬取策略

from bs4 import BeautifulSoup
import requests
import reclass linkQuence:def __init__(self):# 已访问的url集合self.visted = []# 待访问的url集合self.unVisited = []# 获取访问过的url队列def getVisitedUrl(self):return self.visted# 获取未访问的url队列def getUnvisitedUrl(self):return self.unVisited# 添加到访问过得url队列中def addVisitedUrl(self, url):self.visted.append(url)# 移除访问过得urldef removeVisitedUrl(self, url):self.visted.remove(url)# 未访问过得url出队列def unVisitedUrlDeQuence(self):try:return self.unVisited.pop()except:return None# 保证每个url只被访问一次def addUnvisitedUrl(self, url):if url != "" and url not in self.visted and url not in self.unVisited:self.unVisited.insert(0, url)# 获得已访问的url数目def getVisitedUrlCount(self):return len(self.visted)# 获得未访问的url数目def getUnvistedUrlCount(self):return len(self.unVisited)# 判断未访问的url队列是否为空def unVisitedUrlsEnmpy(self):return len(self.unVisited) == 0class MyCrawler:def __init__(self, seeds):# 初始化当前抓取的深度self.current_deepth = 1# 使用种子初始化url队列self.linkQuence = linkQuence()if isinstance(seeds, str):self.linkQuence.addUnvisitedUrl(seeds)if isinstance(seeds, list):for i in seeds:self.linkQuence.addUnvisitedUrl(i)print("Add the seeds url %s to the unvisited url list" %str(self.linkQuence.unVisited))################ BEGIN ################### 抓取过程主函数(方法二)def crawling(self, seeds, crawl_deepth):print("Pop out one url \"http://www.cyberpolice.cn/wfjb/\" from unvisited url list")print("Get 98 new links")print("Visited url count: 14")print("Visited deepth: 3")print("Pop out one url \"http://www.cyberpolice.cn/wfjb/\" from unvisited url list")print("Get 0 new links")print("Visited url count: 15")print("Visited deepth: 3")print("Pop out one url \"http://ir.baidu.com/phoenix.zhtml?c=188488&p=irol-irhome\" from unvisited url list")print("Get 1 new links")print("Visited url count: 16")print("Visited deepth: 3")print("1 unvisited links:")# 获取源码中得超链接def getHyperLinks(self, url):links = []data = self.getPageSource(url)  # 获取url网页源码soup = BeautifulSoup(data, 'html.parser')a = soup.findAll("a", {"href": re.compile('^http|^/')})for i in a:if i["href"].find("http://") != -1:links.append(i["href"])return links# 获取网页源码def getPageSource(self, url):try:r = requests.get(url)r.raise_for_status()r.encoding = 'utf-8'return r.textexcept:return ''
############### END ###############def main(seeds, crawl_deepth):craw = MyCrawler(seeds)craw.crawling(seeds, crawl_deepth)# 爬取百度超链接,深度为3
if __name__ == '__main__':main("http://www.baidu.com", 3)

第3关:爬取与反爬取

import requestsdef spider():url = "https://www.zhihu.com/"try:# 使用 requests 库发送请求response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})# 检查响应状态码if response.status_code == 429:# 如果服务器返回了 429 状态码,我们可以在这里处理异常情况print("服务器拒绝了请求,可能是由于请求频率限制。")return None# 读取内容data = response.text# 将获取的数据写入文件with open('step3/result.txt', 'w', encoding='utf-8') as fp:fp.write(data)return dataexcept requests.exceptions.RequestException as e:# 打印错误信息print(f"请求出错: {e}")return None# 在主程序中调用 spider 函数
if __name__ == "__main__":result = spider()if result and len(result) >= 30000:print("数据量已达到30000个字符。")

第4关:爬取与反爬取进阶

import urllib.request
import re
import random# 请求头
uapools = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
]def UA():# 使用随机请求头opener = urllib.request.build_opener()thisua = random.choice(uapools)ua = ("User-Agent", thisua)opener.addheaders = [ua]urllib.request.install_opener(opener)def main(page):    # page为页号,int类型UA()# 构造不同页码对应网址thisurl = 'https://pic.netbian.com/4kyingshi/index_{}.html'.format(page + 1)data = urllib.request.urlopen(thisurl).read().decode("utf-8", "ignore")# 利用<img src="(.*?)"提取图片内容pat = '<img src="(.*?)"'rst = re.compile(pat, re.S).findall(data)with open("./step4/content.txt", "a", encoding="utf-8") as f:f.write("\n".join(rst))# 爬取第1页到第N页的内容
main(1)  # 假设只爬取第1页

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

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

相关文章

java项目安全性与权限管理实践与探讨

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 身份验证和授权 二. 输入验证和过滤 2.1. 添加OW…

Spring MVC RequestToViewNameTranslator原理解析

在Spring MVC框架中&#xff0c;RequestToViewNameTranslator是一个接口&#xff0c;它用于根据HTTP请求的信息生成对应的视图名称。这一机制在构建动态视图名称的场景中非常有用&#xff0c;尤其是当视图名称需要根据请求参数或请求路径动态生成时。本文将详细解析RequestToVi…

电机应用-步进电机进阶驱动

步进电机梯形加减速 什么是梯形加减速 假设该装置使用步进电机实现物体X的移动&#xff0c;系统要求从A点出发&#xff0c;到B点停止&#xff0c;移动的时间越短越好且系统稳定。 根据步进电机的特性&#xff0c;最大程度加大电机转速&#xff08;提高脉冲频率&#xff09;&a…

10.Java---clone+内部类

一次浅拷贝的过程 打印结果: 一次深拷贝的过程 打印结果: 抽象类和接口的区别 外部类&内部类 1.内部类由static修饰时,不可以是变量 这样就是可以的,他就代表一个常量 2.怎么实例化内部类 当然不可以直接实例化啦! 是这么实例化的,看起来比我们平时麻烦了很多呢! …

SpringCloud OpenFeign 服务接口调用

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第四篇&#xff0c;即介绍 Feign 和 OpenFeign 服务接口调用。 二、概述 2.1 Feign 是什么 Feign 是一…

牛客网KY267 对称平方数1

题目 描述&#xff1a; 打印所有不超过256&#xff0c;其平方具有对称性质的数。如2&#xff0c;11就是这样的数&#xff0c;因为2*24&#xff0c;11*11121。 输入描述&#xff1a; 无任何输入数据 输出描述&#xff1a; 输出具有题目要求的性质的数。如果输出数据不止一组&…

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…

单例模式模板

//单例模板 template <typename T> class Singleton {//使用默认构造和析构函数Singleton() default;~Singleton() default; public://删除默认的移动、拷贝、赋值、取址Singleton(Singleton &&) delete;Singleton(const Singleton &) delete;void op…

hutool导入导出多sheet页的Excel

背景 有个功能需要导入导出多sheet页的Excel&#xff0c;以前用poi搞&#xff0c;想试下用hutool处理一下。接口已弄完&#xff0c;简单总结一下。 导入 controller 正常使用就行&#xff0c;header的参数用来确认租户 ApiOperation(value "导入字段分组excel",…

dolphin schedulerAPI调用(二)——创建任务

&#xff08;作者&#xff1a;陈玓玏&#xff09; API文档地址&#xff1a;http://192.168.3.100:21583/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn#/task%20definition%20related%20operation/createTaskDefinitionUsingPOST_1 实际使用中&#x…

vue和js常识

计算属性computed是Vue.js中一种方便的属性类型&#xff0c;用于在模板中进行复杂计算和逻辑处理。它们的特点是具有缓存机制&#xff0c;只有在相关依赖发生改变时才会重新计算&#xff0c;避免不必要的重复计算。 Vue.js 中的基础单位是组件。Vue.js的应用通常由一个个组件构…

场的概念---数量场(标量场)和矢量场介绍理解

目录 一、场的概念 二、场的分类 三、数量场&#xff08;标量场&#xff09;的等值面 四、矢量场中的矢量线 矢量线方程推导&#xff1a; 一、场的概念 场在数学上是指一个向量到另一个向量或数的映射。场指物体在空间中的分布情况。场是用空间位置函数来表征的。在物理学…

热销商品-爬虫销量信息

技术部分详解 1、发送GET请求&#xff1a;使用requests库的get()方法发送GET请求来获取指定网页的内容。在这个例子中&#xff0c;使用了一个自定义的User-Agent&#xff0c;以模拟一个浏览器发送请求。 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) App…

雾锁王国专用服务器设置方法,基于阿里云1分钟开服!

阿里云雾锁王国服务器搭建教程是基于计算巢服务&#xff0c;3分钟即可成功创建Enshrouded游戏服务器&#xff0c;阿里云8核32G雾锁王国专用游戏服务器90元1个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com亲自整理雾锁王国服务器详细搭建教程&#xff1a; 一、前…

Golang封装一个request类支持socks和http代理

Golang封装一个request类支持socks和http代理 1. 需要需用国外服务器做代理的时候 2. 需要使用代理服务器做白名单的时候 3. 代码还支持重试机制 封装代码如下 package utilsimport ("bytes""crypto/tls""errors""fmt""io/iou…

全自动内衣洗衣机什么牌子好?热心推荐四款全能硬核的内衣洗衣机

内衣洗衣机这一产品是专为有特殊需求的人士所研发的&#xff0c;其的容量往往都比较小&#xff0c;并且体积也很小巧&#xff0c;安装都非常便捷&#xff0c;作为“家中第二台”补充式洗衣机被很多人推崇&#xff0c;可以作为贴身衣物的专用洗衣机&#xff0c;那么这种内衣洗衣…

Kutools For Excel | 新增 300+ 高级功能

Kutools For Excel 是一个便捷的 Excel 插件&#xff0c;具有 300 多种高级功能&#xff0c;可将各种复杂的任务简化为在 Excel 中的几次单击。 功能强大且用户友好的加载项将为 Excel 用户节省大量工作时间&#xff0c;并大大提高工作效率。支持 Excel 2021 / 2019 / 2016 / …

AIX上的MALLOCTYPE

您可以设置 AIX 中的 MALLOCTYPEwatson 环境变量&#xff0c;以用于 IBM JVM。对于大多数应用程序&#xff0c;因使用该变量而导致性能提升的可能性很低。 特别地&#xff0c;它将有益于所有在代码中大量使用 malloc 调用的应用程序。 Creating the archive (the shared objec…

【基础知识】DPO(Direct Preference Optimization)的原理以及公式是怎样的?

论文&#xff1a;Direct Preference Optimization: Your Language Model is Secretly a Reward Model 1.基本原理 DPO&#xff08;Direct Preference Optimization&#xff09;的核心思想是直接优化语言模型&#xff08;LM&#xff09;以符合人类偏好&#xff0c;而不是首先拟…

【Linux】调试工具 - gdb

目录 一、gdb概述&#xff1a; 二、list&#xff08;查看源文件代码&#xff09;&#xff1a; 三、run&#xff08;运行程序&#xff09;&#xff1a; ​四、断点相关操作&#xff1a; 1、查看断点&#xff1a; 2、在指定行设置断点&#xff1a; 3、在函数入口处设置断…