【python数据抓取技术与实战】单机数据抓取

大数据抓取与存储:如何用Python构建高效的数据抓取系统 本文介绍了使用Python构建高效大数据抓取系统的关键技术。主要内容包括:大数据抓取面临的挑战(数据量大、频率高、分布式需求等);常用抓取框架(Scrapy、Selenium、BeautifulSoup+Requests)的选择与使用;不同类型的数据存储方案(关系型数据库、NoSQL、分布式文件系统);系统架构设计(单机与分布式爬虫);以及性能优化方法(异步并发、限速重试、负载均衡等)。文章为构建稳定高效的大数据抓取系统提供了全面的技术指导。 阅读详情

1、单机顺序抓取

这里使用的是Spynner库进行单进程抓取,通常用于目标明确及抓取内容数量不是很大的情况。加之我们用的python3,安装过程也复杂,所以我们就不必在这部分花时间了。但在这里,我们做一个简单的介绍。

优点:Spynner基于pyqt库,pyqt封装了强大的webkit,具有执行JavaScript的能力,可以完全模拟一个浏览器的功能和行为。

import spynner                                           #引入模块
browser=spynner.Browser()                                #生成一个“浏览器”
browser.show()                                           #显示“浏览器”
browser.load('http://www.phei.com.cn')                   #加载网页
browser.wait(10)                                         #等待10秒,为了使“浏览器”多停留一会,以便观察
browser.close()                                          #关闭“浏览器”,彻底释放资源

2、requests

requests库,它是python的http库,可以完成绝大部分与http应用相关的工作。与spynner不同的是,requests是一种非界面化的库,不能模拟浏览器的全部行为,常用的两种方法为:get和post。

get方法在爬虫基础那一讲,我们已经知道了它的部分使用方法。我们来一起看一下代码:

import requests
#形式一
resp1=requests.get('http://www.phei.com.cn/')

#形式二
params_dict ={
    'key1':'value1',
    'key2':'value2'
}
resp2=requests.get('http://httpbin.org/get',params=params_dict)
print(resp2.json())

post方法,比get方法的形式更复杂一些。get方式提交的数据最多只能是1024字节,post是没有大小限制的。

还是先来看看代码:

import requests
post_data ={
    'user':'uname',
    'upass':'upassword'
}
resp3=requests.post('http://httpbin.org/get',data=post_data)
print(resp3.json())

header和cookie

header可以将我们的get和post伪装成浏览器,因为在抓取时对方的可能会判断请求方是否是浏览器,如果为浏览器才响应,返回数据。cookie中常常包含浏览器信息和用户信息,某些网站就是通过cookie信息来判断用户的。

3、并发和并行

主要技术包括:多线程、多进程、携程gevent。下面我们就进入正题:

为了更好的运用技术,我们先解释以下概念

  • 并发,在一个时间段内发生若干事件的情况。就像单核的CPU,多任务操作系统的各个任务是并发运行的,各个任务会以分时的方式在一段时间内分别占用CPU依次执行,如果在自己的时间段里没有完成,那么需等待下一次得到CPU的使用权才会继续。
  • 并行,同一时刻发生若干时间的情况。就像多核的CPU,多个任务可能在多个核上同时运行。
  • 同步,并发或并行发生的各个任务之间不是孤立独自运行的,一个任务的进行可能需要在获得另一个任务给出的结果之后。各任务的运行会彼此相互制约。
  • 异步,并发或并行发生的各个任务之间彼此是独立运行的,不受各自的影响。

实验爬取计算机类的图书名和链接,单线程、多线程、多进程、协程的时间比较,代码如下:

import requests
from bs4 import BeautifulSoup
import threading              #线程
import multiprocessing        #进程
import gevent                 #协程
from gevent import monkey     #协程中需导入的包
monkey.patch_all()            #协程没有这两句,会变成依顺序抓取
import time

def format_str(s):
    return s.replace('\n','').replace(' ','').replace('\t','')

def get_urls_in_pages(from_page_num,to_page_num):
    urls=[]
    search_word='计算机'
    url_part_1='http://www.phei.com.cn/module/goods/searchkey.jsp?Page='
    url_part_2='&Page=2&searchKey='
    for i in range(from_page_num,to_page_num+1):
        urls.append(url_part_1+str(i)+url_part_2+search_word)
    all_herf_list=[]
    for url in urls:
        #print(url)
        resp=requests.get(url).text
        bs=BeautifulSoup(resp,'lxml')
        a_list=bs.find_all('a')
        needed_list=[]
        for a in a_list:
            if 'href' in a.attrs:
                href_val=a['href']
                title=a.text
                if 'bookid' in href_val and 'shopcar0.jsp' not in href_val and title !='':
                    if [title,href_val] not in needed_list:
                        needed_list.append([format_str(title),format_str(href_val)])
        all_herf_list+=needed_list
    all_herf_file=open(str(from_page_num)+'_'+str(to_page_num)+'_'+'all_hrefs.txt','w')
    for href in all_herf_list:
        all_herf_file.write('\t'.join(href)+'\n')
    all_herf_file.close()
    #print(from_page_num,to_page_num,len(all_herf_list))

def single_threads_test():
    t1=time.time()
    get_urls_in_pages(1,40)
    t2=time.time()
    print('单线程使用时间:',t2-t1)

def multiple_threads_test():
    t1=time.time()
    page_range_lst=[(1,10),(11,20),(21,30),(31,40)]
    th_lst=[]
    for page_range in page_range_lst:
        th=threading.Thread(target=get_urls_in_pages,args=(page_range[0],page_range[1]))
        th_lst.append(th)
    for th in th_lst:
        th.start()
    for th in th_lst:
        th.join()
    t2=time.time()
    print('多线程使用时间:',t2-t1)

def multiple_process_test():
    t1=time.time()
    page_range_lst=[(1,10),(11,20),(21,30),(31,40)]
    pool=multiprocessing.Pool(processes=4)
    for page_range in page_range_lst:
        pool.apply_async(get_urls_in_pages,page_range[0],page_range[1])
    pool.close()
    pool.join()
    t2=time.time()
    print('多进程使用时间:', t2 - t1)

def gevent_test():
    t1=time.time()
    page_range_lst = [(1, 10), (11, 20), (21, 30), (31, 40)]
    jobs=[]
    for page_range in page_range_lst:
        jobs.append(gevent.spawn(get_urls_in_pages,page_range[0],page_range[1]))
    gevent.joinall(jobs)
    t2=time.time()
    print('协程使用时间:', t2 - t1)

if __name__=='__main__':
    single_threads_test()
    multiple_threads_test()
    multiple_process_test()
    gevent_test()

输出结果如下:

单线程使用时间: 280.38603711128235
多线程使用时间: 68.45191502571106
多进程使用时间: 1.3390767574310303
协程使用时间: 15.374879360198975

可以发现相比单线程而言,多线程执行方式的确能够提高抓取的效率。然而多线程的在网络良好的情况是远远比不上多进程的,因为多进程抓取的快慢主要取决于网络。协程,又叫做子例程,可以把它看作是一种轻量的线程,似乎比多线程的处理更高效。

使用 Python 抓取亚马逊产品数据: 分步指南 在本分步指南中学习如何使用Python抓取亚马逊产品数据。探索提取标题、价格、评论等的实用技巧。 阅读详情

相关推荐

使用Hadoop与Python抓取并分析大数据的完整指南

Hadoop是一个开源的分布式计算框架,旨在存储和处理大规模数据。:分布式文件系统,用于存储海量数据。它能够将大数据拆分为多个块,并将它们分布式存储在多台机器上。MapReduce:分布式计算模型,支持大规模数据处理任务的并行执行。MapReduce可以将数据处理任务拆分为多个子任务,分布式计算并汇总结果。Hadoop的优势在于其高扩展性、容错性和高吞吐量,特别适用于处理PB级别的数据集。Python提供了多个库来帮助我们进行网页抓取和数据处理。requests:用于发送HTTP请求并获取网页内容。

2201_76125261的博客 456

python使用spynner抓取动态页面数据

http://www.comingcode.com/?p=275     这篇文章是我最近一直想完成的一篇文章,因为之前做的爬虫只能爬取静态页面的数据,但是现在这个时代,大部分的web页面都是动态的,经常逛的网站例如京东、淘宝等,商品列表都是js获取到后台数据后再组合成html展示出来的,单纯获取页面数据回来,而没有执行到js的话是无法看到商品数据列表信息的,这个可以通过两步来验

QZC295919009的专栏 4791

网站内容抓取技术与实战详解

网站内容抓取技术,是指通过自动化程序从互联网页面中提取结构化或非结构化数据的技术手段。其核心目的在于实现数据采集、信息整合与分析,广泛应用于搜索引擎优化(SEO)、电商价格监控、舆情分析、市场调研等多个领域。从早期的手动复制粘贴,到如今基于Python、Scrapy、Selenium等工具构建的自动化爬虫系统,抓取技术经历了从静态页面解析到动态渲染、从单机运行到分布式架构的演变。当前,抓取技术面临的主要挑战包括反爬机制日益复杂、数据动态加载、IP封禁等问题。

weixin_42583683的博客 2055

Python spynner 解决中文不显示

spynner  Spynner是一个可编程Web浏览器Python模块。支持AJAX。 Spynner是一个有状态,可编程Web浏览器Python模块。它基于 PyQT 和 WebKit构建。支持 Javascript, AJAX,和所有其它WebKit能够处理的技术(Flash, SVG, ...)。Spynner利用 JQuery。 使用Spynner你可以模拟一个Web浏

java、python、大数据 1125

spynner-2.19

spynner-2.19,在windows上也可以轻松的抓取动态网页啦

Python数据抓取技术与实战.pdf

Python数据抓取技术与实战.pdf Python数据抓取技术与实战.pdf Python数据抓取技术与实战.pdf

探索Spynner:Python自动化网页抓取与交互利器

探索Spynner:Python自动化网页抓取与交互利器 项目简介 Spynner是一款强大的Python库,专为自动网页浏览、网页数据抓取和交互而设计。它通过模拟浏览器行为,可以轻松处理JavaScript渲染的内容,并提供了丰富的功能,如点击链接、填写表单、执行JavaScript等。对于需要进行大规模网页爬虫或自动化测试的开发者来说,这是一个非常实用的工具。 技术分析 JavaScript支...

gitblog_00084的博客 384

python抓取天气并分析 实例源码

Python代码抓取获取天气预报信息源码讲解。这是一个用Python编写抓取天气预报的代码示例,用python写天气查询软件程序很简单。这段代码可以获取当地的天气和、任意城市的天气预报,原理是根据url找到网站截取相应的数据展现。 python抓取广州天气并分析 实例源码

python开发浏览器_Spynner是一个可编程Web浏览器Python模块

Spynner is a stateful programmatic web browser module for Python. It is based upon PyQT and WebKit. It supports Javascript, AJAX, and every other technology that !WebKit is able to handle (Flash, SVG...

weixin_34219634的博客 449

三边定位的最小二乘法运用

已知:条件基站到移动台的距离D,基站的坐标(xi,yi,zi) 求:移动台的坐标(x,y,z) 运用最小二乘法的核心是找到最小二乘法的矩阵形式即 Ax=B 在本次实验中通过三边定位计算得到 A=[A;2*(xi-x1),2*(yi-y1),2*(zi-z1]; %系数矩阵A b=[b;D1^2-Di^2+xi^2+yi^2+zi^2-x1^2-y1^2-z1^2]; %增广矩阵b

qq_26250141的博客 1万+

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器: 二、由两个半加器构成的1-bit全加器: ..

zep 1万+

使用 scrapy 爬取 stackoverflow 上的所有 Python 问答

点击“简说Python”,选择“星标公众号”福利干货,第一时间送达!大家好,我是老表阅读文本大概需要 5分钟今天,给大家分享个爬虫实战案例。如果你此前从未听说Scrsp...

简说Python的博客 1615

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 754

python数据抓取与实战_Python数据抓取技术与实战

第1章 Python基础1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!11 Python安装1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!12 安装pip 6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!13 如何查看帮助7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!14 第一个程序10 !!!!!!!!!!!!!!!!!!!!...

weixin_39531374的博客 142

DroidGuard虚拟机逆向解析:指令集、密钥派生与反调试机制

DroidGuard是Google在Android生态中部署的轻量级定制虚拟机,用于设备完整性校验。其核心原理是通过自解释字节码、多层混淆指令集与动态密钥派生机制,在ART运行时构建静默安全沙箱。技术价值在于规避传统API检测盲区,实现高鲁棒性环境感知;典型应用场景包括金融SDK风控、Play Services可信启动及合规性审计。本文深入拆解其4字节指令编码规则、基于设备指纹的三阶段密钥派生(SHA256→Feistel→AES)、以及五层反调试体系(ptrace快照、时间差分、内存页探测、指令流校验、服

weixin_32736961的博客 587

MLX90640 热成像 STM32

MLX90640 热成像

zhaocundang's blog 5007

python数据抓取与实战_Python数据抓取技术与实战 pdf

Python数据抓取技术与实战 目录D11章Python基础1.1Python安装1.2安装pip1.3如何查看帮助1.4D1一个实例1.5文件操作1.6循环1.7异常1.8元组1.9列表1.10字典1.11集合1.12随机数1.13enumerate的使用1.14D1二个实例D12章字符串解析2.1常用函数2.2正则表达式2.3BeautifulSoup2.4json结构D13章单机数据抓取3....

weixin_39727934的博客 126

金蝶云星空v8.0私有化部署与cpolar内网穿透:构建企业级远程ERP访问通道

本文详细介绍了金蝶云星空v8.0企业版的私有化部署流程与cpolar内网穿透技术,帮助企业构建安全高效的远程ERP访问通道。从系统环境准备、SQL Server配置到内网穿透安全加固,提供全流程实战指导,助力企业实现本地部署与远程办公的无缝衔接。

weixin_28736335的博客 376

python抓取数据的技术_Python数据抓取技术与实战 pdf

Python数据抓取技术与实战目录D11章Python基础1.1Python安装1.2安装pip1.3如何查看帮助1.4D1一个实例1.5文件操作1.6循环1.7异常1.8元组1.9列表1.10字典1.11集合1.12随机数1.13enumerate的使用1.14D1二个实例D12章字符串解析2.1常用函数2.2正则表达式2.3BeautifulSoup2.4json结构D13章单机数据抓取3.1...

weixin_39934640的博客 93

GStreamer中h264parse元素

h264parse是 GStreamer 中处理 H.264 视频流的关键元素,主要负责解析和准备 H.264 流以便后续处理。

深之JohnChen的专栏 1027

地图自定义编码CSV转换成ini文件

创 建 schema.ini 文件:有时,当您尝试使用 .csv 文件将自定义地理信息导入 Tableau 时,您可能会看到“无法使用.csv,因为它不包含唯一列”错误消息。这是因为您的 .csv 文件可能包含数值数据,例如数值邮政编码。对于新的地理角色,Tableau 将只接受文本字段。但是,您可以创建一个 schema.ini 文件,以指示 Tableau 应将您要导入的数值字段视为文本字段。...

wenyusuran的专栏 1975

Python数据抓取技术与实战 pdf

Python数据抓取技术与实战 目录 D11章Python基础1.1Python安装1.2安装pip1.3如何查看帮助1.4D1一个实例1.5文件操作1.6循环1.7异常1.8元组1.9列表1.10字典1.11集合1.12随机数1.13enumerate的使用1.14D1二个实例D12章字符串解析2.1常用函数2.2正则表达式2.3BeautifulSoup2.4json结构D13章单机数...

weixin_34015860的博客 573

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python爬虫(24)Python分布式爬虫架构实战:Scrapy-Redis亿级数据抓取方案设计

在千万级数据抓取需求下,传统单机爬虫面临严峻挑战: ‌IP封锁阈值‌:单个IP日均请求上限普遍低于5万次 ‌存储性能瓶颈‌:内存型去重库(如set)突破百万级后性能骤降 ‌网络带宽限制‌:单机下载带宽利用率峰值仅达60% ‌故障恢复困难‌:断点续爬需要手动维护复杂状态 ‌扩展成本高昂‌:垂直扩展(升级硬件)成本呈指数增长 ‌分布式爬虫优势‌: 横向扩展:线性提升抓取吞吐量 动态伸缩:根据负载自动增减节点 高可用性:单节点故障不影响整体任务

优快云博客专家,领域包括但不限于:AI、大数据、Python、架构师,有合作、课程、问题、疑惑请私信博主 2938

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python爬虫【二十四章】分布式爬虫架构实战:Scrapy-Redis亿级数据抓取方案设计

‌吞吐量飞跃‌:线性扩展提升40倍+处理能力‌成本优化‌:硬件利用率提升至85%以上‌系统健壮性‌:实现7×24小时稳定运行。

2501_92499985的博客 2087

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python爬虫实战:电商数据抓取与反爬策略

网络爬虫作为数据采集的核心技术,通过模拟HTTP请求实现网页内容的自动化获取。其工作原理主要基于请求响应机制和DOM解析,Python生态的Requests、BeautifulSoup等库极大降低了开发门槛。在数据驱动决策的今天,爬虫技术广泛应用于竞品分析、舆情监控等商业场景,特别是电商领域的价格监控需求旺盛。针对淘宝等平台的反爬机制,需要掌握IP代理池、请求头伪装等对抗策略,同时需注意分布式爬虫架构设计和法律合规边界。本文通过商品信息抓取案例,详解动态内容加载处理和验证码破解等工程实践。

weixin_30851867的博客 856

数据集成-4-Python数据爬取技术与实战

数据集成-4-Python数据爬取技术与实战

SpriCoder的博客 873
上一篇: 【python数据抓取技术与实战】json
下一篇: 【汇总】软件、资料下载清单
yeverwen
博客等级 码龄14年 116粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值