大数据之如何利用爬虫爬取数据做分析

目录

前言

爬虫概述

爬虫实现

1. 获取代理IP

2. 爬取数据

3. 多线程爬取

总结


前言

随着互联网和智能设备的普及,数据量逐年增长,数据分析和挖掘成为了热门领域,其中大数据分析技术和爬虫技术是重要的手段之一。本文主要介绍如何使用Python编写爬虫程序,通过代理IP,爬取数据进行分析。

爬虫概述

爬虫是指一种自动化获取并处理各种互联网信息的程序。爬虫程序可以根据特定的规则和算法,自动化地从互联网上抓取信息,支持对抓取到的信息进行自动化处理、筛选和分析等操作。

与普通的网页浏览器不同,爬虫可以批量自动获取特定网站的信息,且可以通过一定的方式绕开网站的禁止爬虫机制,支持对网站进行长期大量抓取。

爬虫实现

我们以爬取[豆瓣电影TOP250](https://movie.douban.com/top250)为例进行介绍。我们使用Python语言和requests、BeautifulSoup4等第三方库进行编写。

1. 获取代理IP

在爬取数据的过程中,我们需要使用多个代理IP来绕过网站的限制。我们可以通过以下代码获取免费代理IP:

import requests
from bs4 import BeautifulSoupdef get_proxies():url = 'https://www.zdaye.com/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}r = requests.get(url, headers=headers)soup = BeautifulSoup(r.text, 'html.parser')trs = soup.find_all('tr')ips = []for tr in trs[1:]:tds = tr.find_all('td')ip = tds[1].text + ':' + tds[2].textips.append(ip)return ips

该函数通过访问站大爷代理IP(https://www.zdaye.com/)获取代理IP,返回一个代理IP列表。

2. 爬取数据

为了防止被网站识别出爬虫的行为并限制我们的访问,我们需要设置一些请求头和代理IP。我们可以通过以下代码实现:

import requests
from bs4 import BeautifulSoup
import random
import timeheaders_list = [{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'},{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'},{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'},{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Safari/537.36'},{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'},{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; Trident/7.0; AS; rv:11.0) like Gecko'},{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 Edge/16.16299'},{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'},{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; AS; rv:11.0) like Gecko'},]def get_movie_info(url, proxies):headers = random.choice(headers_list)proxy = random.choice(proxies)proxies = {'http': 'http://' + proxy, 'https': 'https://' + proxy}try:r = requests.get(url, headers=headers, proxies=proxies, timeout=10)if r.status_code == 200:soup = BeautifulSoup(r.text, 'html.parser')title = soup.find('div', class_='title_wrapper').h1.text.strip()rating = soup.find('span', itemprop='ratingValue').textdirector = soup.find('h4', text='Director:').next_sibling.text.strip()actors = [a.text.strip() for a in soup.find_all('span', itemprop='name')]genre = [a.text.strip() for a in soup.find_all('span', itemprop='genre')]country = soup.find('h4', text='Country:').next_sibling.text.strip()language = soup.find('h4', text='Language:').next_sibling.text.strip()release_date = soup.find('h4', text='Release Date:').next_sibling.text.strip()return {'title': title, 'rating': rating, 'director': director, 'actors': actors, 'genre': genre, 'country': country, 'language': language, 'release_date': release_date}else:print('Request Failed ' + url)return Noneexcept:print('Request Failed ' + url)return None

该函数通过随机选择请求头和代理IP,获取特定电影的相关信息,并返回一个字典。

3. 多线程爬取

当我们需要爬取大量数据时,单线程爬取速度较慢,效率不高。我们可以使用多线程技术提高爬取效率。下面是一个实现多线程爬取的函数:

import threading
from queue import Queueclass CrawlerThread(threading.Thread):def __init__(self, crawler, url_queue, proxies):threading.Thread.__init__(self)self.crawler = crawlerself.url_queue = url_queueself.proxies = proxiesdef run(self):while True:url = self.url_queue.get()if url is None:breakmovie_info = self.crawler(url, self.proxies)if movie_info is not None:print(movie_info)self.url_queue.task_done()def crawler_worker(crawler, url_queue, proxies):for i in range(5):CrawlerThread(crawler, url_queue, proxies).start()url_queue.join()for i in range(5):url_queue.put(None)def crawl_movies(crawler, urls, proxies):url_queue = Queue()for url in urls:url_queue.put(url)crawler_worker(crawler, url_queue, proxies)

该函数通过启动多个线程,实现多个爬虫同时爬取数据。我们可以通过以下代码调用该函数:

proxies = get_proxies()
urls = ['https://movie.douban.com/top250?start={}&filter='.format(i * 25) for i in range(10)]
crawl_movies(get_movie_info, urls, proxies)

总结

本文主要介绍了如何利用Python编写爬虫程序,通过代理IP,爬取数据进行分析。爬虫程序是一种重要的数据采集工具,具有高效、灵活、自动化等优点。在实际应用

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

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

相关文章

Python框架批量数据抓取的高级教程

一、背景介绍 批量数据抓取是一种常见的数据获取方式,能够帮助我们快速、高效地获取网络上的大量信息。本文将介绍如何使用Python框架进行大规模抽象数据,以及如何处理这个过程中可能遇到的问题。 二、项目需求 我们将爬取大量知乎文章,讨…

扁平化菜单功能制作

网页效果&#xff1a; HTML部分&#xff1a; <body><ul class"nav"><li><a href"javascript:void(0);">菜单项目一</a><ul><li>子菜单项01</li><li>子菜单项02</li><li>子菜单项03<…

matlab面向对象编程入门笔记

文章目录 1. 类和结构2. 定义类3. 属性3.1 private/protected/public属性3.2 constant属性3.3 hidden属性 4. 方法4.1 private/protected/public方法4.2 static方法4.3 外部方法 5. 动态调用6. 继承-超类6.1 handle超类6.2 dynamicprops 和 hgsetget子类 7. 封闭(sealed)类、方…

波奇学Linux:Linux进程状态,进程优先级

编写一个程序模拟进程 查看进程状态 修改代码后发现进程状态为由S变成R R为运行态&#xff0c;S为阻塞态 第一次为S是因为调用了外设&#xff08;printf调用屏幕外设&#xff09;&#xff0c;实际上应该为R&#xff0c;S状态轮换&#xff0c;但是R太快了&#xff0c;所以每次…

性能测试之Locust(完整版)

官方文档&#xff1a;Locust说明文档 一、Locust简介 1、定义 Locust是一款易于使用的分布式负载测试工具&#xff0c;完全基于事件&#xff0c;即一个locust节点也可以在一个进程中支持数千并发用户&#xff0c;不使用回调&#xff0c;通过gevent使用轻量级过程&#xff08…

订单管理系统开发经验的总结:优化流程、提升效率的关键实践

前言 一.订单管理系统的架构设计 二.订单系统的详细设计 1.拆分 2.换货 3.发货 4.拦截 5.取消 6.物流回传 三.订单系统的订单状态流转 初始状态 中间状态 异常状态 终态 四.订单系统的关键代码逻辑 五.结语 前言 两年来&#xff0c;整个订单管理系统经过大大小…

序列生成模型(一):序列概率模型

文章目录 前言1. 序列数据2. 序列数据的潜在规律3. 序列概率模型的两个基本问题 一、序列概率模型1. 理论基础序列的概率分解自回归生成模型 2. 序列生成 前言 深度学习在处理序列数据方面取得了巨大的成功&#xff0c;尤其是在自然语言处理领域。序列数据可以是文本、声音、视…

【算法Hot100系列】三数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

人生感悟 | 又是一年,眼看要2024了

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 刚过完大雪节气没两天&#xff0c;气温开始急转直下&#xff0c;走在路上明显感觉冷了许多。看天气预报很多地区已经开始下雪了。 看日历已经12月9号了&#xff0c;12月份&#xff0c;一年的最后一个月&#xff0c;2…

别小看Python的【print】函数,这些高级用法你知道吗?

文章目录 引言技巧1&#xff1a;格式化输出示例1&#xff1a;使用%s来插入字符串&#xff0c;使用%d来插入整数示例2&#xff1a;使用字符串的format()方法示例3&#xff1a;使用f-string格式化输出 技巧2&#xff1a;控制输出文本的颜色技巧3&#xff1a;将打印结果重定向至文…

PyVMomi 克隆虚拟机时将磁盘改为Thin模式

需求介绍&#xff1a; 之前已经使用pyvmomi库实现了虚拟机的自动备份&#xff0c;不过由于备份的虚拟机都是较为重要的系统&#xff0c;磁盘都是厚置备模式&#xff0c;终于有一天&#xff0c;备份目标的空间不够了&#xff0c;导致几个虚拟机无法备份。在不想增加磁盘的情况下…

【计算机网络】—— 详解码元,传输速率的计算|网络奇缘系列|计算机网络

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 码元 速率和波特 思考1 思考2 思考3 带宽&#xff08;Bandwidth&#xff09; &#x1f4dd;总结 码元…

Linux+Docker+Gitee+Jenkins自动化部署.NET Core服务

目录 一、安装Jenkins 1、跟新yum包 2、查询镜像 3、拉取镜像 4、创建Jenkins工作目录&#xff0c;并将容器内目录挂载到此目录上 5、启动Jenkins容器 二、Jenkins配置 1、Jenkins安装gitee码云插件 2、创建私人令牌 3、Jenkins添加全局凭据 4、系统配置 三、构建任…

C++之程序生成

一、C的发展史 截止到2023年12月&#xff0c;C已经更新了很多版本&#xff0c;并在每个版本中修复了bug和添加了新的特性&#xff0c;ISO C委员会每三年会对C进行一次更新&#xff1a; C98&#xff1a;于1998年发布&#xff0c;是最早的国际标准化版本。它包含了面向对象编程…

Typescript中Omit数据类型的理解

在 TypeScript 中&#xff0c;Omit 是一个内置的工具类型&#xff0c;它用于从对象类型中排除指定的属性&#xff0c;并返回剩余的属性。 Omit 的语法如下所示&#xff1a; type Omit<T, K> Pick<T, Exclude<keyof T, K>>;其中&#xff0c;T 表示原始类型…

D3D12可编程渲染流水线

一、初始化D3D库 启用 DirectX数学库 x86需要启用SSE2指令集&#xff0c;所有平台均需将浮点模型设置为fast。默认为&#xff1a; 精度 (/fp:precise)。 #include <DirectXMath.h> #include <DirectXPackedVector.h> 启用调试模式下的内存泄漏检测 // Enabl…

CCF-CSP真题《202309-5 阻击》思路+ c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202309-5试题名称&#xff1a;阻击时间限制&#xff1a;2.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 上回提到&#xff0c;西西艾弗岛下方有一个庞大的遗…

【面试】广告优化

a1&#xff1a;点击率公式是什么&#xff1f;点击率低的原因是什么&#xff1f; 点击率点击/曝光&#xff0c;点击率低的原因主要有两点&#xff1a;一是创意不吸引人&#xff1b;二是目标受众不准确/定向过宽不精确&#xff0c;广告曝光给了对产品不感兴趣用户 a2&#xff1a;…

mysql学习记录

insert into table_nameA(字段名) select 字段名 from table_nameA&#xff08;按照一般的select语句格式进行&#xff09; 通过此语句&#xff0c;可以根据需要抓取数据组成新记录落表 存储过程&#xff1a; 创建&#xff1a; CREATE PROCEDURE pro_name&#xff08; IN o…

mysql !=索引为什么失效

可以先看这个&#xff1a;Mysql查询条件为大于时&#xff0c;不走索引失效场景-CSDN博客 如下建立了联合索引&#xff0c; 注意查询phone是用不对劲了索引&#xff0c;key_len82 改为 !时&#xff0c; key key_len没内容&#xff0c;说明没有走索引&#xff0c;为什么没有走&…