您的位置:首页 > 财经 > 产业 > 界面网页设计培训_创业平台有哪些_新闻头条新闻_优化网站排名茂名厂商

界面网页设计培训_创业平台有哪些_新闻头条新闻_优化网站排名茂名厂商

2025/1/14 5:03:53 来源:https://blog.csdn.net/zz10986708/article/details/145081830  浏览:    关键词:界面网页设计培训_创业平台有哪些_新闻头条新闻_优化网站排名茂名厂商
界面网页设计培训_创业平台有哪些_新闻头条新闻_优化网站排名茂名厂商

摘 要

当今网络领域发展的时代背景下,传统的搜索引擎面临一些局限性挑战,尤其是网络上有接近十分之三的网页信息重复,为了让开发者爬取质量更高的数据,并且爬取到不仅仅是表层网页,而是更多属于深层网页的信息。开发者引入网络爬虫技术,网络爬虫技术是按照实际需求爬取万维网信息资源的脚本或程序,也是现在通用浏览器的核心组件之一,网络爬虫涉及范围广泛,便利于人们的同时也有人用它做触犯法律的行为,根据爬取过程和内部结构可以分为四种类型,常用的是聚焦型、通用型的爬虫。python作为最佳的爬虫工具,通过python的网络爬虫,我们能实现爬取需求数据,建模,分析的高效操作。

本文主要研究了python在做一般的网络爬虫过程的基本过程及robots协议及反爬道德规范,以及python在做网络爬虫前的计算机系统环境,语法结构,编译集成环境,正则表达式等解析工具比较分析,第三方库对比分析,scrapy等开发框架对比,json,cvs文件及三种爬虫中常用数据库的连接及其技术中台的基本用法;最后通过新冠肺炎疫情数据爬取信息做相关模型分析及可视化处理。

关键词:网络爬虫;python;正则表达式;scrapy;json

Abstract

Under the background of the development of the Internet, the traditional search engine is facing some limitations and challenges. Especially, there are nearly three tenths of the web page information repetition on the Internet. In order to let developers crawl higher quality data, and crawl to not only the surface page, but more information belonging to the deep page. Developers introduce web crawler technology. Web crawler technology is a script or program that crawls the World Wide Web information resources according to the actual needs, and it is also one of the core components of the current general browser. Web crawler covers a wide range, which is convenient for people and people to use it to violate the law. According to the crawling process and internal structure, there are four types, focusing type and general-purpose type. Python as the best crawler tool, through Python's web crawler, we can achieve the efficient operation of crawling demand data, modeling and analysis.

This paper mainly studies the basic process of Python in the process of doing general web crawler, robots protocol and anti crawling code of ethics, as well as the comparative analysis of computer system environment, syntax structure, compilation integration environment, regular expression and other analytical tools, the comparative analysis of third-party libraries, the comparison of development frameworks such as scratch, JSON, CVS files and three kinds of crawlers The connection of database and the basic usage of platform in the technology;finally, novel coronavirus pneumonia epidemic data were crawled for information analysis and visualization

Key words: web crawler;python;scrapy;regular expression;json

目 录

1 导论……………………………………………………………………………………………4

1.1 选题背景与意义…………………………………………………………………………4

1.2 国内外文献综述…………………………………………………………………………4

1.3 论文的结构及主要内容…………………………………………………………………5

1.4 论文的研究方法…………………………………………………………………………5

2 python在网络爬虫中的特点优势展示………………………………………………………5

2.1 python语言本身特点……………………………………………………………………5

2.2 python强大的解析工具…………………………………………………………………6

2.3 python主流爬虫框架……………………………………………………………………7

2.4 python爬虫中对不同格式文件处理…………………………………………………9

2.5 图形验证识别技术……………………………………………………………………11

3 python网络爬虫中的流程及规范…………………………………………………………11

3.1 发起请求………………………………………………………………………………11

3.2 获取响应内容…………………………………………………………………………12

3.3 解析内容………………………………………………………………………………12

3.4 处理保存………………………………………………………………………………12

3.5 反爬技术………………………………………………………………………………12

3.6 爬取效率的加速处理…………………………………………………………………13

3.7 爬虫道德规范robots协议……………………………………………………………13

4 新冠肺炎疫情数据爬取信息的分析………………………………………………………14

参考文献………………………………………………………………………………………16

附录……………………………………………………………………………………………17

致谢……………………………………………………………………………………………20

1 导 论

1.1 选题背景与意义

在网络时代的发展期间,3w承载着大量信息资源,为了有效提取且利用这些信息。我们使用过的一些传统的搜索引擎作为我们访问万维网的向导,具有协助我们搜索信息的工具。然而,这些传统的搜索渠道也不足之处较多:1、搜索需要在特定的项目中差别性导致传统的搜索引擎呈现的网页信息不是我们的需求。2、传统搜索引擎的目的是网络涵盖范围尽可能大,少数的的搜索引擎服务器资源与大量的网络信息资源之间的矛盾升级。3、万维网数据格式的丰富扩展和软件技术的进步,多种形式的文件数据登台,传统搜索引擎会对这些信息量大且有特定结构的数据处理上有难度,不能很好地发现和获取。4、传统的搜索引擎主要是鉴于关键词的检索,很难具备根据语义查询的作用。

网络爬虫技术恰好能解决这些问题:网络爬虫是一个自动化执行目的性提取网页的程序,它为搜索引擎从3w上下载网页信息,也是搜索引擎的组件。总的来看,爬虫的涉及范围非常广,主要是围绕社会各人利益,因此有好有坏:所有搜索引擎内部组件,交通出行行业抢票系统,社交网站,电子商务购物生活平台,类似O2O等利用黑色SEO的网站,还有政府部门。在做网络爬虫开发中,python的爬虫框架丰富,其自身的特性及丰富的第三方库资源,还有很强的多线程处理能力造就了它网络爬虫的最佳选项,python网络爬虫的作用大致有如下几点:是一般搜索引擎的采集器必要组件;科学研究:应用在对人类社会规律建模探究,科学计算,数据挖掘,数据分析,数据可视化探究等方面。

1.2 国内外文献综述

网络爬虫技术是按照实际需求爬取网上信息资源的脚本或程序。网络爬虫按结构和实现原理不同分为:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的,网络上有接近十分之三的网页信息重复,为了让开发者爬取质量更高的数据,网络爬虫方式采取单独爬取,动态和静态分配三种并行爬取方式,常用的爬虫策略除了有广度、深度、大站优先,还有反链策略等,常用的更新策略有用户体验型,历史数据型,聚类分析型。

通用网络爬虫是基础的爬虫方式,一般的都是从n个起始网页开始,抓取出新的URL,此后连续在当前页面基础上爬取最新URL放入URL队列,同时将以及爬取的信息放入列表中,当满足循环停止条件时程序停止。爬取目标从一些 URL到整个3W网。通用网络爬虫的爬取规模大,主要的要求方向是运行速度跟文件存储空间,对爬取页面顺序的规定较少;因为等待页面多,导致页面刷新时间长,这种爬虫方式使用并行爬取方式。这种方式的爬虫结构模块有:爬取页面,分析页面,过滤链接,存放页面的数据库,URL存放队列、URL原始集合;这种爬取方式会执行的爬取策略来提高爬虫效率:深度和广度优先策略。

聚焦网络爬虫是在前者基础扩充了爬行筛选体系和明确爬取需求;和前一种相比,这种爬取方式需求针对性更强,节省了硬件设备和网站资源,存储页面数据不多所以更新节奏更迅速,可以提供特定客户的特定需求领域;聚焦网络爬虫增设链接及内容评价阶段,链接及内容评价的好坏和访问他们的顺序决定了执行其不同的爬虫策略。常用的爬行策略有:针对爬取内容评价,针对链接构造的评价,针对强化学习的爬行策略,针对语境图的爬行策略。

增量型网络爬虫针对的方向是刷新完成爬取的网站和爬取新增或刷新的网站,这样的方式就可尽量确保获取出的信息是最新的;增量型是仅在客户提出需求情况下爬取新增的或刷新的网页,不需要处理没有实现刷新的网页,其爬取策略比较繁琐,不过可迅速刷新爬取信息,降低了网站加载数据信息量,节约时间;该网络爬虫的结构模块:爬行,排序,更新,本地页面集合,等待爬取的URL集合,本地页面URL集合。该网络爬虫的目的是保证本地页面集合中存放的网页是最新的页面,并且增加本地页面集合的页面的质量。

深层网络爬虫,我们的网页有两种网页表现形式:表层和深层,前者是我们能用一般搜索引擎搜索到的页面,通过超链接形式,跳转到主要由静态网页构成的网络页面上,而后者是数据信息不能通过超链接获得的,且隐匿到搜索的表单,用户仅通过输入关键字才获取到的网络页面,举例:注册信息后才能浏览的页面,而深层信息量比表层多的多,因此deep网页是量最大,发展最好的新型资源。深层网络爬虫的构成有六个基础模块,两个爬虫的数据结构。

1.3 论文的结构及主要内容

第一节导论介绍了本文的选题背景与意义,及网络爬虫在国内外文献综述,说明文章用的研究方法。第二节python在网络爬虫中优势特点展示主要介绍python的语言作为网络爬虫首选编辑语言的原因及优势:python语言本身的特点,各种强大的第三方库的对比分析,python各种编译集成环境的对比分析;python几种常用的解析方式的分析, python主流爬虫框架的对比分析;python爬取中对json文件,cvs文件,mysql数据库,redis数据库,MongoDB数据库的技术中台分析研究以及对这些文件的处理过程;图形验证识别技术的描述性研究。第三节是python做爬虫一般过程及网络规范描述性研究分析,主要有反爬机制的描述性研究,实现快速处理巨大爬取数据几种策略和爬虫道德规范协议的生成原因及用途。最后一节利用python结合实际情况制作的爬虫应用实例。

1.4 论文的研究方法

描述性研究法、信息研究方法、模拟法、功能分析法 、个案研究法、文献研究法

2 python 在网络爬虫中优势特点展示

2.1 python语言本身特点

首先来分析一下Python语言本身的优势:一是其学期曲线短、免费、开源的编程语言;二是其编译环境可以不同的操作系统,本文的环境是Win10和python3.7;三是这种高级编程语言具有可注释,可移植,便于交互,面向对象的特性。

python的数据类型大多同其他高级编程语言类似;变量名是英文字母、数字、下划线的组合;主要关键字有30多个;和其他语言类似的基本运算符;流程控制结构有顺序、选择、循环结构;函数的定义和输出也比较容易;代码一般不需要使用分号,表达简洁。

python支持不同的编辑器,其中,PyCharm是最受欢迎的,这里集成环境也是在PyCharm 2019x64下进行,其支持web框架,提供智能代码平台,支持远程开发,git、debug、快捷键都能集成;IDLE具有多窗口界面,但其不能渎职到库,脚本不能超100行代码;Spyder是为科学数据开发的开源集成环境,轻量高效,也是做简单爬虫的不错环境;JuPyter是只需浏览器就能访问的编译器,也是数据分析最好选择。

在python网络爬虫中经常需要一些强大的库(这里介绍的也有自带的库):网络库:urllib(python原生库)、urllib3(安全连接池、支持文件post、可用性高)、requests、socket(底层网络接口)、hyper(支持http2)、Phantomjs(在webkit基础之上的JavaScript API);浏览器自行处理:selenium;正则表达式:re; XML\HTML解释器:lxml、beautifulsoup、PyQuery(基于jQuery);文本处理:Unidecode(转化为美国信息交换标准代码)、fuzzywuzzy(模糊字符串匹配)、Json(将对象转化为json字符串)、rows(常用数据接口支持的格式很多)、textract(从各种文件中提取文本)、tablib(把数据导出为cvs、json、yaml)openpyxl(读取写入excel2010);自然语言管理:中文分词工具jieba、PyPLN;多重处理:threading(多线程)、multiprocessing(多进程);异步处理:Tornado (拥护异步服务,客户端)、Twisted(驱动型框架);队列:RedisQueue管理器;网址:netaddr(显示和操作地址)、urllib.parse(地址接口)、crossbar(分布式平台路由器,实现WebSocket)、dnsyo(DNS测试);计算机视觉:OpenCV(开源视觉库);python工具列表:python-github-projects、pythonidae;文件存储仓库:pymysql等;数据分析:pandas、scipy、numpy;数据可视化:matplotlib;IPython(交互式shell);内建模块:itertools、base64、collections等。

这些库下有相关包,包下面有不同模块,模块下分不同类,类下有函数;内部库直接导用;其余的使用有两种方式:一是pip处理,首先测试pip版本情况,之后打pip install完成,pip也能实现库的几种基本处理;二是使用conda,其为Anaconda的重要组件,使用前查看版本,再创建环境,执行情况如下:

conda –versionconda create –name <环境名><该环境下的包>

2.2 python 强大的解析工具

python在网络爬虫数据解析时需要三大解析工具,他们各有优缺,下表为三工具对比:

表2-1 三大解析工具特点对比

解析抓取工具

解析速度

使用难度

安装难度

lxml

简单

一般

beautifulSoup

最简单

简单

正则表达式(re)

最快

困难

无(内置)

第一种是可以分别获取并分析html和xml数据,而对这两种数据的查询模块是xpath;其使用定位路径得到所需的xml节点并局部搜索访问;XPath大致语法如下图:

添加图片注释,不超过 140 字(可选)

图2-1

在python3.7环境下,lxml爬取大致代码技巧如下:

lxml.etree.HTML #解析html字符串htmlelement=etree.HTML(text)lxml.etree.parse #解析htmlhtmlelement = etree.parse("tencent.html")print(etree.trosting(htmlelement,encoding=’utf-8’).decode(“utf-8”))

第二种工具分析数据利用DOM技术,能展现浏览器上网页全部文档形式,依据三种的标签遍览的形式,再解析整个DOM结构,跟第一种比较下,第二种工具同样处理html和xml数据,但消耗一部分时间空间,因此功能不如lxml强。提取的文档结构中主要有四种对象,而所有文档遍览和搜索都围绕着他们进行:检索dom方式可以通过find all或find,也可通过select配合css进行,后者比前者更容易找出元素。beautifulsoup常用方法还有string、strings、stripped_strings、get_text。下图为其四种解析器的对比分析:

添加图片注释,不超过 140 字(可选)

图2-2

第三种正则的常用规则是:(.)目的是匹配任意字符串,但对换行符\无效;\A仅在字符串开始处匹配;\d目的是匹配任意数字(0~9);\D目的是匹配任意的非数字;\s目的是匹配空白或特殊字符(\n,\t,\r,空格);\S目的是匹配任意非空白字符;\w目的是对应的字母数字下划线;\W目的是和\w相反的;\Z仅在字符串最后处匹配;*目的是匹配n(n>=0)个符合的字符;+目的是匹配m(m>=1)个符合的字符;?目的是匹配(t=0或t=1)个符合的字符;{n}目的是匹配n个复合的字符;{m,n}匹配第m到第n个字符;[]中括号里匹配的字符是没有顺序的且 . 在[]里为其原含义而不加意味着随意一个字符;^代表以…结束(在中括号[]里代表取反);$代表以…结束;|代表匹配多个字符串或表达式;贪心模式将匹配规模较多,而非贪心较小;转义字符是\;原生字符是r目的是防止漏写反斜杠。

正则下经常用到match从字符数据之首配对,不存在符合的就结束,这个方法要是添加re.DOTALL可配对换行的字符;search可匹配满足条件的字符;group方法里参数是多少就输出多少个,参数的最小值是1;findall以列表形式输出全部匹配的信息;sub可更换掉符合的字符串;split可以根据就re规范割分字符串;complile用来编译,添加参数re.BERBOSE后能标记注解来提高效率。

2.3 python主流爬虫框架

Python的框架将汇成所需的模块以提高爬虫开发效率。我们可把许多常用爬虫实现代码记录完整,之后留住某些接口,以后做其他的爬虫项目时,我们就可以依据其特定的情况,自行书写仅需要替换变动的代码部分即可,且根据特定需要调用那些留下的API,就 能够实现一个爬虫项目。下面介绍几个常用的爬虫框架:

requests是同步设计,为了让效率增加,采用异步设计框架:aiohttp是完全异步框架,对HTTP客户端和服务端同步支持,能够实现快速异步爬虫,且较容易完成自行转码,便于中文编码;Vibora框架异步速度最快; asks有如下大致框架:

添加图片注释,不超过 140 字(可选)

图2-3

类似selenium库,Selenium 配上webdriver目的是模拟浏览器请求,效率高:pyppeteer是异步浏览器,特别接近浏览器自身设计接口,比较容易加入JS;requestium是requests和selenium封装的产物,支持接口切换,自带Wait Until设计,可以避免代码执行错误;arsenic和selenium接口最接近,开发研究成本低。

前端渐进式框架:异步生成器策划出渐进型且封装性强的框架Grab;Web应用框架是把其不同模块集成,使得构建程序更迅速,大多数web框架运行在服务端,也有少数和客户端结合:Django是最常用广泛的python web应用开发框架,遵循MMVC架构开源且全自动化管理后台,仅需要使用ORM,做一个定义对象后就能自动生成数据库,可以通过URl完成复杂的映射,Django可仅通过安装包安装,django生态,开发性能也很完备,脚手架丰富,创建一个Django项目直接输入:

pip install Djangodjango-admin startproject djdemo cd djdemodjango-admin startapp djapptree -L 3

即可构建django项目;TurboGears遵循MVC架构,遵循聚合,拥有健壮的对象关系映射器,遵循不同数据库间事务,把可重用的代码片段作为模板,灵活对接非标准组件,遵循分片技术,创建TG项目直接输入:pip install tg.devtools\n gearbox quickstart tgdemo即可,查看项目使用功能需输入gearbox –help;web2py框架可支持开发人员发开交互式动态网站,作为鲁棒式全栈开发框架,可轻松部署,开发者装载后能自动携带一个数据库,支持web的IDE,以及有n个对象组成的接口API,具有可靠的安全性,组织破坏浏览器cookie的行为也能防止跨站请求伪造攻击,不方便之处是其缺乏内建的单元测试支持过程;做轻量型爬虫项目时应该选择小型网络运行框架: flask,其对象类型定义了网络服务器和应用的接口标准,修饰器提供了挪用函数的地址,通过run保证服务器公用,通过http发送给服务器不同的访问地址方式,通过jinja将模板于动态信息合并,内部提供路由和cookies,可自行搭建小型网络程序。

前面所说的并不都是针对爬虫项目而设计的框架,Scrapy目的就是爬取网站数据和结构性数据设计的框架,还能扩展到数据挖掘,自动化测试和监测领域,scrapy通过Twisted异步网络库来支持网络通讯,框架架构及运行流程大致如图:

添加图片注释,不超过 140 字(可选)

图2-4

Scrapy组件包括:scrapy(引擎)、scheduler(调度器)、downloader(下载器)、spiders(爬虫)、pipeline(管道项目)、downloader middlewares(下载器中间件)、spider middlewares(爬虫中间件)、scheduler middlewares(调度中间件)等,具体作用如下图:

添加图片注释,不超过 140 字(可选)

图2-5

框架的常用代码:

scrapy startproject<爬虫名称> #创建爬虫scrapy genspider<爬虫项目名称> #创建爬虫项目名称scrapy crawl<爬虫名称> #启动爬虫class <爬虫名字>item(scrapy.item) #定义参数item

2.4 python爬虫中对不同格式文件处理

文件处理和数据库处理在python爬虫中是重要部分,爬虫常用文件是json文件和cvs文件。Json为简洁清晰数据交换格式,具有其特定的文本格式处理数据,便于解析生成,定义关系如下表:

表2-5 python基本数据类型和json格式字符转换关系

Python

Json

dict

object

List、tuple

array

Str、unicode

string

int、long、float

number

none

null

json的核心思想通过dumps和dump编辑成json格式,原理同上类似,把json对象转换成python的过程用到loads和load,了解四个函数原型后进行具体步骤:导入json,使用dump或者dumps等函数将特定的数据转化为json或者json加载为python,并存放ASCII编码,通过函数原型输出json_str, 引用with open()as方便自动关闭文件。

CVS为字符分隔符,cvs格式的文件使用相同数据存储类型,它的文件内容不含二进制形式的数据,是以分隔符隔段的记录形式组成,内部格式headers,values分别表示[]列表形式,value的列表里有元组数据或字典数据。cvs处理数据首先需用引用writer对象使用cvs库读取cvs文件:导入cvs库,然后引用with open(’x.cvs’,’w’) as x1 ;用reader对象取读cvs文件,使用方法有几种:使用索引访问导入cvs库,用with open转化为,参数是cvs格式文件 headers = next(_cvs) 列表rows遍历_cvs形式文件然后全部输出,这种访问方法有时会造成混乱;导入collections库后可以通过列名实现对下标访问;或者引用字典序列,读取需要输出一个.get()形式。应用中,码农应根据实际情况扩展代码形式,也可以创建不同模块类,来实现复杂需求。

数据仓库也是爬虫项目需要连接存放和处理的格式,爬取的大型数据在储存时整理到不同数据库中,不同情况下用到的数据库类型不同,其中主要存放的数据库有以下几种:

pymysqldb是基于mysql,在win10系统下的需先通过连接对象得到游标,根据游标操作SQL,执行完成后切断数据库。常用代码如下:

connect(主机地址,用户名,连接密码,数据库名) #连接数据库execute(self,”需要进行的SQL操作”,args) #执行sql操作fetchone #查找获取一个值fetchall #查找获取获取所有值commit #向数据库提交增删改查等操作set names gbk #解决除utf-8的操作乱码

Redis-py基于redis,赋予其两种类执行对此持久化的数据库的操作,常用代码如下:

import redis #安装数据库模块e = redis.Redis(主机ip名, 端口, 默认0数据库) #连接数据库decode_responses = true #键值对中输出字符串数据pool = redis.connectionpool(主机ip,端口,decode_responses)e = redis.Redis(connection_pool=pool) #创建共享连接池pipe = e.pipeline #建立管道execute #执行操作save #同步数据bgsave #异步数据flushdb #删除当前数据库中的键flushall #删除整体数据库的键move(key,db) #移除数据库键到其他数据库

MongoDB可以存储文档的分布式非关系型数据库,python中安装mongodb模块需要在cmd中输入pip install pymongodb后导入,连接数据库时需要输入本地服务器名和密码,获取mongodb对象即可进行nosql操作,集合操作包括创建,插入,增删改查,保存,涉及到方法有查询find和findone,自定义查找where,指定数量的命令limit,跳过命令skip,升降序查询sort,去重distinct,聚合aggregate。在创建管道后涉及到替换文档内容project,数据清洗过滤match,限制管道输出的文档limit和跳跃指定文档skip的先后顺序,拆分集合unwind,,分组group,注意添加preserveNullAndEmptyArrays:true保证文档不会缺失。

2.5 图形验证识别技术

python在做爬虫时会遇到一些情况需要进行图形验证码的鉴别和图形的转化,这里就需要提供tesseract库将图像转化为文字(OCR技术),这个库可减少爬取中遇到验证码的干扰。首先在官网里下载tesseract,我的选择环境是win64,之后python中用pip安装后使用,还需要配置环境变量,在path中添加路径后,输入tesseract -v检测版本即可。检测工具有两种:Tesserat先将准备转换的图片下载到文档中,然后输出tesseract 图片名称 result即可转换为txt格式文本,而在python3.7的pytesseract中需从PIL中导入Image模块和pytesseract,调用图文转换的方法image_to_string,最后输出txt格式文件。除了可以识别字符,文字,还可识别验证码:导入urllib中的request,和PIL中的Image,在调用request的urltrieve方法把验证码图像下载到本地文档,最后输出,这里还需要引用time模块,使得图文转换间隔性执行输出time.sleep(n),通过引用image. convert的参数L,把图片灰度化;若继续增加图像识别准确度,将L替换成1 则可进行自定义阈值的二值化转换。

3 python网络爬虫中的流程及规范

3.1 发起请求

使用python爬取数据之前我们需要了解客户发出的需求是什么,才方便选取不同的方案,需求大致分为爬取app或者网页内容,网页爬虫分为两种渲染形式:服务端和客户端,而爬取app可按照接口形式分为通用型,加密参数型,加密内容型,非常规协议型。

网站爬虫状态前一种情况下,需求信息放到html中,服务器端修饰后输出所需页面信息,通常使用一些HTTP的requests请求库实现爬取数据信息内容;第二种情况是使用JS修饰网页数据信息,其子情况由几种:通过自带开发工具的浏览器寻求一种于服务端换取数据信息并且能刷新信息的接口的参数及请求信息,在通过请求库的模仿方法运行程序;若所需的api信息庞大,应提供自行浏览器应用工具selenium组件运行爬取需求内容;当所需信息封装在html的js变量中时,使用正则直接获得js数据。

爬取app的几种接口形式通过下图表现:

添加图片注释,不超过 140 字(可选)

图3-1

每个爬取场景下都需要通过http发出一个请求形式模仿浏览器,换句话说就是让开发者自己的特定需求通过socket客户端传递给socket服务端,请求内容就是requests的不同参数及方法;其用法最常见的就是get形式的请求,这种请求方式的参数值如果繁杂,可以用分隔符划分以便方便识别,请求头的主要信息包括:所需网站的主机ip和端口,相对地址,开发者的用户信息,cookies等信息,这种请求方式内部参数有包括:各种数据信息头如特殊指令头,地区时间头、json字符串头、cookies标记头、文件操作头;以及设定的重定向方法、实现分批下载二进制数据流的stream,通过proxies来创建代理,实现提交服务端应答的imeout,信息数据认证方式及路径。

通过post请求方式实现模仿登录浏览器的操作,除了登录发操作以外,这种请求方式还提供上传和打开文件的操作:

{ file:open(‘文件名’‘rb’)} #通过字典类型打开文件r.post(文件路径,文件名) #上传文件和脚本文件放相同文件夹

除以上请求方式还有网页提交请求,向网页的局部修改请求,网页的删除请求等。请求规则是在不同的请求状态下将看成是使用不同浏览器维护不同的对话情形。则一个任务中同时使用不同的请求方式模仿浏览器,将不会正常获取同一数据。

3.2 获取响应内容

若服务器囊括了requests提交的内容时,服务端会输出应答提交的请求内容,其中也包括应答头和应答主体部分:response返回不同响应属性形式,status_code返回网站服务器应答状态:响应状态有成功状态,跳转状态,文件不存在状态,无权限访问状态,服务器错误状态;http响应返回字符串形式:r.text;通过encoding输出 http响应内容的编码方式;content返回内容的二进制信息;分析响应内容的编码方式由apparent_encoding实现 ,上传文件后网络服务器会发出应答,返回form,请求头,json,数据地址等字段。

3.3 解析内容

我们利用python强大的爬虫解析模块实现前面提取需求的过程:json解析将json数据形式转为python对象;解析二进制时使用with open (filepath,‘wb’)as x方式写入文件x.write(response.content);解析html数据用到几种解析方式:css selector解析较容易,需要css select或者pyquery;xpath是最常用的解析语法,需要lxml,scrapy selector等第三方库;强大的正则表达式需要正则库;但是如果爬虫项目网站多,解析逻辑内容复杂,我们就需要提出智能解析策略,若容错率可定情况下,使用智能解析策略将提高效率节省解析时间。该策略需要许多算法框架:readability根据权重计算算法获取所需的区块集合(newspaper库);疏密度分析,计算单位内的区块平均文本长度;scrapy的内部组件scrapyly可以通过自己学习——指定的页面和提取结果,来操作类似的页面结构;deeply学习通过注释实现高效分析数据信息。

3.4 处理保存

通过实际业务的需求,将爬取得到的文件存放到一个存储媒介中,存储形式有文件json、cvs、txt、jpg、png、mp4、mp3等视频,音频,图片,文本文件格式,存储时需要的库是cvs、json、pandas、xlwt等python库;基于数据库的模块pymongodb,pymysql、redis-py等;分布式搜索引擎用于检索和实现文本匹配,常用库有pysolr;存储到企业云端:BAT的企业云。

3.5 反爬技术

反爬技术是个重要的技术,多年以来,爬虫技术和反爬的无烟战争一直在持续,常见的反爬方式:当headers里没有user-agent,就是模拟浏览器不成功,而针对封IP和封帐号的处理方式分别为图3-2和图3-3

添加图片注释,不超过 140 字(可选)

图3-2

添加图片注释,不超过 140 字(可选)

图3-3

最常用的反爬手段是验证码,可以根据OCR技术实现鉴别,或者各种高效训练模拟鉴别,也可通过官方平台鉴别。验证码有滑触型,短信语音型,扫描型,图像型,计算型等。

3.6 爬取效率的加速处理

爬虫过程中使用单线程爬取效率低下,就如同串联电路,一个进程卡住,其他的也不能进行,为了加速爬取效率,我们使用多种加速方式:

在N线程或者N进程爬虫方式下,计算机的多核模式下加上一个GIL锁能使其和多线程处理同步,其内的单个线程操作是:增设GIL锁,运行爬虫程序,当程序休眠或挂起时结束运行,当计数器检测到运行时间接近临界值时,打开GIL;多线程加速方式通过thread模块完成,其中接受父级线程需要thread.daemon;由multiprocessing完成多进程加速方式,其中自带队列,管道搭建下一级进程的插件和自定义对象的run方法。

异步也可加速爬取,把爬取过程换成非阻塞模式,就可在响应前执行其他任务,所用的模块有支持异步的服务器客户端tornado,以及其下开发的pyspider;通过事件推进完成加速爬虫的twisted,以及其下开发的scrapy。

分布式处理也可以提高爬虫效率,将整体爬虫的不同任务通过一些分布式或者异步任务工具衔接到一个共享状态下,可以使用scrapy-redis框架或kafka。

加速方式也可以通过提供DNS缓存,优化去重解析方法和分离模块管控来优化实现。

3.7 爬虫道德规范robots协议

robots.txt是网站和爬虫技术的ASCII编码格式的文本文件协议,url对字母大小写敏感,因此文件名为小写格式,可以辨别网络蜘蛛有能力获取的数据信息,且本身存放在网站根目录下,所有爬虫的爬取策略都遵循robots协议,在robots.txt中#为注释,*为所有,/为根目录。下图为不同爬虫模式下的遵循情况:

添加图片注释,不超过 140 字(可选)

图3-3

添加图片注释,不超过 140 字(可选)

图3-4

网络爬虫还会遇到各种问题:首先是spider的频繁模拟,给web service带来负担;而且有些情况会导致服务器产权和个人隐私问题。

4 新冠肺炎疫情数据爬取信息的分析

2019年底,新冠肺炎COVID-19开始蔓延,我们每天都需要关注全球疫情趋势和现状,那我们开源通过python网络爬虫技术在网上获取数据并分析,或者利用这些数据进行2019新冠肺炎的可视化研究,丁香园便是我们寻找数据的app,我们在github找到丁香园开源API接口如下图:

添加图片注释,不超过 140 字(可选)

图4-1

例如在area接口中返回的数据有城市ID,各个大洲国家name,中国直辖市省市name,确诊感人治愈和死亡人数及数据的持久化更新等。根据之前提到的知识中台,我们这次的爬虫项目环境是win10×64,python3.7,所用到的持久化数据库是MongoDB,爬取的文件数据有cvs和json列表,编译器是pycharm2019,所用到的模块有requests、pandas、datetime、json、pymongodb、math、numpy、matplotlib、pyecharts、scipy。

在area接口latest=1时可爬取世界各大洲,各个国家和设计区域疫情数据列表,我们从api上获取get数据,并转化为json列表,定义二维数据集dateframe,定义时间戳函数,将爬取的数据转为时间序列,然后在数据集中建立256乘 16 的矩阵列并输出,导入matplotlib、pyecharts的timeline的成员函数render可以查看疫情趋势图,利用drop方法进行每天多次的数据清洗,定义date后获得疫情日期列表并输出;

overall接口latest=1时用requests的get爬取病毒爆发天数,并由病毒增长模型得出二代病例的期望值:

病毒传代时间-潜伏时间=传染时间疑似病例转化成确诊病例的概率是0.695一代人群的潜伏期=潜伏时间/病毒传代时间实际预估感染人数=疑似人数*0.695+确诊人数病毒早期增长率=log(实际感染人数)/病毒爆发时间一代中一典型患者在易感人群里导致患二代病例的期望值=1+早期指数增长率*病毒传代时间+第一代人潜伏期 * (1-一代人群的潜伏期)*pow(病毒早期增长率*病毒传代时间,2)

通过下图的传染病模型SEIR:

添加图片注释,不超过 140 字(可选)

图4-2

导入numpy,matplotlib,scipy并推到符合实际的新冠肺炎微分方程,并设立迭代形式,分别为下图:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

图4-3 图4-4

导入datetime模块,将爬取的数据转化为时间序列,并呈现在可视化图像中,显示某个城市的疫情趋势,传入SEIR,time,INI参数绘制如下疫情趋势图像:

添加图片注释,不超过 140 字(可选)

图4-5

横坐标是病毒爆发天数,先缓慢到迅速再缓慢的绿色是治曲线愈恢复者趋势;先增长后下降的红色曲线是感染者趋势;下降速度由慢而快的深蓝色是易感者趋势;先增长后下降的橙色曲线代表潜伏者趋势。输出值为1.6280901350179797 0.3617978077817733 3497796.217990224 169 2020-07-10

最后根据这个实例应用,愿世界人民早日战胜这个传染性强的病毒。

参考文献

[1]郭丽蓉.基于Python的网络爬虫程序设计[J].电子技术与软件工程.2017(23)

[2]李琳.基于Python的网络爬虫系统的设计与实现[J].信息通信. 2017(09)

[3]刘杰,葛晓玢,闻顺杰.基于Python的网络爬虫系统的设计与实现[J].信息与电脑(理论版). 2018(12)

[4]唐琳,董依萌,何天宇.基于Python的网络爬虫技术的关键性问题探索[J].电子世界. 2018(14)

[5]陆树芬.基于Python对网络爬虫系统的设计与实现[J].电脑编程技巧与维护. 2019(02)

[6]彭智鑫.基于Python的深度网络爬虫的设计与实现[J].信息记录材料. 2018(08)

[7]曲伟峰.浅析Python网络爬虫[J].计算机产品与流通. 2019(09)

[8]李培.基于Python的网络爬虫与反爬虫技术研究[J].计算机与数字工程. 2019(06)

[9]魏程程.基于Python的数据信息爬虫技术[J].电子世界. 2018(11)

[10]钱程,阳小兰,朱福喜.基于Python 的网络爬虫技术[J].黑龙江科技信息. 2016(36).

[11]苻玲美.正则表达式在 python 爬虫中的应用[J].电脑知识 与技术. 2019(25).

[12]李军红.基于Python 的辅助教学系统[J].电子技术与软 件工程. 2019(17).

[13]邵晓文.多线程并发网络爬虫的设计与实现[J].现代计算机(专业版). 2019(1)

[14]陈乐.基于Python的网络爬虫技术[J].电子世界. 2018(16)

[15]胡俊潇,陈国伟.网络爬虫反爬策略研究[J].科技创新与应用.2019(15)

[16]赵茉莉.网络爬虫系统的研究与实现[D].成都:电子科技大学.2013.

[17]熊畅.基于Python爬虫技术的网页数据抓取与分析研究[J].数字技术与应用.2017(9)

[18]冯俐.爬虫技术综述[J].电脑知识与技术, 2017.27

[19]毕森,杨昱昺.基于python的网络爬虫技术研究[J].数字通信世界. 2019(12)

[20]基于Python的网络爬虫技术研究[J]. 王碧瑶.数字技术与应用. 2017(05)

附 录

通过爬取丁香园API得到json数据并根据传染病SEIR模型和计算二代病例的期望值及病毒爆发天数,导入如下代码:

import requests as REQS

import pandas as PD

import datetime as DT

import math

import scipy.integrate as spintg

import numpy as numy

import matplotlib.pyplot as mplt

from pandas.plotting import register_matplotlib_converters

from pandas import DataFrame as DATAF from datetime import date

URL = 'https://lab.isaaclin.cn/nCoV/api/overall?latest=1'

U = REQS.request('GET',URL)

DATA = U.json()

DATAF = PD.dataframe.from_records(DATA[“数据结果列表”])

DATAF['t'] = PD.to_datetime(DATAF[“时间数据更新”]/1000,unit='S')

DATAF['date'] = DATEF['t'].DT.date

DATAF['days'] = (DATEF[“时间数据更新”]/1000 -DT.datetime(2019,12,1,0,0,0).timestamp())/60/60/24

gt = 7.5

lp = 3

ipo = gt – lp

def R01Func(confirm, suspect,t):

p = 0.695

ipogt = lp/gt

yi = suspect * p + confirm

lmd = math.log(yi)/t

R01 = 1 + lmd * gt + ipogt * (1 - ipogt) * pow(lmd * gt,2)

return R01

DATAF['R01'] = DATAF.apply(lambda m: R01Func(m['confirmedCount'], m['suspectedCount'], m['days']), axis = 1)

DATAF

def SEIR(inivalue, _):

Q = numy.zeros(4)

P = inivalue

Q[0] = - (beta * P[0] * P[2]) / N

Q[1] = (beta * P[0] * P[2]) / N - P[1] /gt

Q[2] = P[1] / gt - gamma * P[2]

Q[3] = gamma * P[2]

return Q

T = 300

Time = numy.arange(0, T + 1)

R01 = DATAF.iloc[len(DATAF)-1,df.shape[1]-1]

def betaFunc(R01 = R01, ipo =ipo):

return R01/ipo

def gammaFunc(gt = gt):

return 1/gt

gamma = gammaFunc()

start_day_shanghai = date(2019, 12, 1)

dates_shanghai = [start_day_shanghai + DT.timedelta(n) for n in range(T + 1)]

start_day = date(2020, 1, 23)

dates = [start_day + DT.timedelta(n) for n in range(T + 1)]

N = 27058479

R01 = DATAF.iloc[len(DATAF)-1,DATAF.shape[1]-1]

beta = betaFunc()

INI = (27058479, 0, 16, 0)

RES = spintg.odeint(SEIR, INI, Time)

mplt.plot(dates, RES[:,0],color = 'darkblue',label = 'Susceptible')

mplt.plot(dates, RES[:,1],color = 'orange',label = 'Exposed')

mplt.plot(dates, RES[:,2],color = 'red',label = 'Infection')

mplt.plot(dates, RES[:,3],color = 'green',label = 'Recovery')

mplt.title(' ')

mplt.suptitle('SEIR Forecast: Shanghai Trending')

mplt.legend()

mplt.xlabel('Day')

mplt.ylabel('Number')

mplt.show()

print(R01, beta, max(RES[:,2]),numy.argmax(RES[:,2]), date(2020,1,23) + DT.timedelta(int(numy.argmax(RES[:,2]))))

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com