Python中yield关键字的使用
关键字yield与一个概念相关,即生成器。
生成器是一个不断产生值的函数;
包含yield语句的函数是一个生成器;
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
生成器一般与循环结构搭配使用,如下面的例子。
生成器写法:
12345678>>> def gen(n):... for i in range(n):... yield i**2... >>> for i in gen(5):... print(i, end=' ')... 0 1 4 9 16
普通写法:
12345678>>> def square(n):... ls = [i**2 for i in range(n)]... return ls... >>> for i in square(5):... print(i, end=' ')... 0 1 4 9 16
生成器写法和普通写法看起来效果是一样的,那有 ...
Requests库和Scrapy框架的比较
Requests库和Scrapy框架都是Python中非常重要的第三方爬虫库(框架)。
1. Requests和Scrapy的相同点
两者都可以进行页面请求和爬取,是Python爬虫的两个重要技术路线。
两者都可用性很好,文档丰富,入门简单。
两者都没有处理js、提交表单、应对验证码等功能(可扩展)。
2. Requests和Scrapy的不同点
Requests
Scrapy
页面级爬虫
网站级爬虫
功能库
框架
并发性考虑不足,性能较差
并发性好,性能较高
重点在于页面下载
重点在于爬虫结构
定制灵活
一般定制灵活,深度定制困难
上手十分简单
入门稍难
3. 如何选择Requests和Scrapy?
非常小的需求:Requests库。
不太小的需求:Scrapy框架。
定制程度很高的需求(不考虑规模),自搭框架:Requests > Scrapy。因为Scrapy的“5+2”结构在自搭框架时反而会成为限制,不如直接用Requests库来编写。
Scrapy爬虫框架入门
1. Scrapy爬虫框架介绍 Scrapy SKRAY-pee是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的程序框架。该框架主要由Scrapinghub 公司进行维护。 ——维基百科
1.1. Scrapy的安装普通环境下:pip install scrapy。Anaconda:conda install scrapy 或在图形界面操作。
验证安装:在命令行输入scrapy -h,打印出正确的版本和帮助信息,说明安装成功。
1.2. Scrapy爬虫框架结构Scrapy一共有7个部分,为“5+2结构”,其中5个部分为框架的主体部分,2个部分为中间件。
5个主体:Engine,Scheduler,Item Pipelines,Spiders,Downloader。2个中间件:Engine和Spiders之间的Spider Middleware,Engine-Downloader之间的Downloader Middleware。
数据(包括网络爬虫提交的请求)以及从网络中获取的相关内容,在5个主题模块之间流动,形成数据流。
Scrapy包含 ...
Python中的正则表达式和Re库
1. 正则表达式的概念正则表达式:regular expression,regex,RE。
正则表达式是用来简洁表达一组字符串的表达式。
如有一组字符串如下:
12345'PN''PYN''PYTM''PTRHN''PYTHON'
这组字符串可以用正则表达式简洁的表示:'P(Y|YT|YTH|YTHO)?N'
再有一组字符串如下:
12345'PY''PYY''PYYY'...'PYYYY...'
这组字符串可以用正则表达式简洁的表示:'PY+','+'表示Y可以有1个或无穷多个。
总得来说,正则表达式具有以下特点:1. 通用的字符串表达框架。2. 简洁表达一组字符串的表达式。3. 针对字符串表达”简洁“和”特征“思想的工具。4. 判断某字符串的特征归属。
正则表达式在文本处理中十分常用,他可以:1. 表达文本类型的特征(病毒、入侵等)。2. 同时查找或替换一 ...
中国大学排名定向爬虫
1. 实例介绍世界上针对大学的排名有很多种,这里我们选取由上海交通大学设计研发的最好大学排名。
我们可以在其中获得软科中国最好大学排名2019。
URL为http://zuihaodaxue.com/zuihaodaxuepaiming2019.html。
功能描述输入:大学排名URL链接。输出:大学排名信息的屏幕输出(排名,大学名称,总分)。技术路线:Requests-bs4。定向爬虫:仅对输入URL进行爬取,不扩展爬取。
在进行定向爬虫前,我们要先看看定向爬虫是否可行,也就是要爬取的信息是否在HTML代码中。
有些网站的一些信息是由JavaScript动态生成的,对于这些信息,仅靠Requests和bs4是无法实现的。
我们打开该URL,查看网页源代码,可以看到下面的内容,也就是说,我们要爬取的信息,在HTML代码中。
此外,我们查看此网站的robots协议。
打开http://zuihaodaxue.com/robots.txt ,404 Not Found,说明此网站未对爬虫限制,我们可以合法爬取。
验证可行性后,我们要对程序的结构做一个初步的设计。
对于上面这样的信息形 ...
基于bs4库的HTML内容查找方法
我们有一份由Requests库request.get()方法获得的demo.html文本如下。
demo.html的文本信息存储于demo变量中,且有soup = BeautifulSoup(demo, "html.parser")。
BeautifulSoup库提供了一个方法find_all(),这个方法可以在soup的变量中去查找一些信息。
find_all()有5个参数,返回一个列表类型,存储查找的结果。
<>.find_all(name, attrs, recursive, string, **kwargs)
下面我们对find_all()方法的每个参数进行说明,每次调用的说明写在注释中。
name:对标签名称的检索字符串。
12>>> soup.find_all('a') # 查找<a>[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="li ...
信息提取的一般方法
信息指从标记后的信息中提取所关注的内容。
信息标记有三种形式,XML、JSON和YAML,无论哪种形式,在信息标记中包含标签和信息两个部分。
我们关心的是我们想要提取出的信息内容,该怎么做呢?
方法有非常多种,这里从一般意义上给出几种方法。
序号
方法
信息文本
解析器
优点
缺点
1
完整解析信息的标记形式,再提取关键信息。
XML/JSON/YAML
需要标记解析器。例如:bs4库的标签树遍历。
信息解析准确。
提取过程繁琐,速度慢。
2
无视标记形式,直接搜索关键信息。
任何文本
不需要
提取过程简洁,速度较快。
提取结果准确定与信息内容直接相关。
3
融合方法1和方法2
XML/JSON/YAML/任何文本
需要标记解析器以及文本查找函数。
我们以BeautifulSoup库为例,解释如何实现信息提取。
实例:提取HTML中的所有URL链接。
思路:1. 搜索到所有的<a>标签;2. 解析<a>标签格式,提取属性href中的链接内容。
123456789101112131415161718192021222324252 ...
信息标记的三种形式
1. 什么是信息标记?我们先来说,信息标记的重要性:
标记后的信息可形成信息组织结构,增加了信息维度;
标记后的信息可用于通信、存储或展示;
标记的结构与信息一样具有重要价值;
标记后的信息更利于程序理解和运用。
什么是信息标记呢?这里以HTML格式作为例子来了解什么是信息标记。HTML:Hyper Text Markup Language,超文本标记语言。
HTML是WWW(World Wide Web)的信息组织方式。
HTML能将声音、图像、视频等超文本信息嵌入到文本之中。
HTML通过预定义的<>...</>标签形式组织不同类型的信息,也就是通过标签标记各种信息是什么。
那么信息标记有哪些种类呢?这里说的种类是指信息标记上的一般类型的种类。
简单说,现在国际公认的信息标记种类有三种形式,分别是XML,JSON和YAML。
2. XMLXML:eXtensible Markup Language,扩展标记语言。
XML是一种与HTML很接近的标记语言。从历史发展来看,先有HTML格式后有XML格式,因此可以说XML格式是基于HTML格式的发展来的一种 ...
基于bs4库的HTML格式输出和编码
1. 基于bs4库的HTML格式输出如何能让HTML内容更加友好的显示呢?
这里面的友好,不只是使HTML内容更容易使人阅读,也使程序能更好地读取和分析。
在bs4库中,提出了一个方法prettify(),我们在代码中演示。12345678910>>> import requests>>> from bs4 import BeautifulSoup>>> url = "https://www.crummy.com/software/BeautifulSoup/">>> r = requests.get(url)>>> r.status_code200>>> r.encoding'UTF-8'>>> r.text'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"\n"http://www.w3.org/TR ...
基于bs4库的HTML内容遍历方法
1. HTML基本格式如果我们把HTML代码做一个结构化的设计,可以发现HTML代码是一个具有树形结构的文本信息。
事实上任何一个HTML或XML文件都是这样标签树形结构,这样的树形结构形成了三种遍历方法。
下行遍历:从根节点开始向叶结点遍历。
上行遍历:从叶结点开始向根节点遍历。
平行遍历:在平级结点之间遍历。
注意,一个标签结点的孩子结点不仅包括标签结点,也包括字符串结点,如'\n'等。
2. 标签树的三种遍历方法
2.1. 下行遍历标签树的下行遍历一共包含三个属性,如下。
属性
说明
.contents
子节点的列表,将<tag>所有儿子结点存入列表。
.children
子节点的迭代类型,与.contents类似,用于循环遍历儿子结点。
.descendants
子孙结点的迭代类型,包含所有子孙结点,用于循环遍历。
12345678>>> soup.head.contents['\n', <meta content="text/html; charset=u ...