Scrapy框架中如何更改下载中间件里的headers?

大家好,我是我是皮皮。

一、前言

前几天在Python最强王者交流群有个叫【麦当】的粉丝问了一个关于Scrapy框架中如何更改下载中间件里的headers问题,这里拿出来给大家分享下,一起学习。

二、解决过程

如果只是单纯的一次性添加,那么可以使用下面这个方式,直接在settings.py文件中设置:

但是他想动态的修改,这样的话,单纯的修改就有点力不从心了。

不过不慌,这个这里给出【小王】大佬的解答,一起来看看吧,下面是他给的一个示例代码,下面这个代码写在middleware.py文件。

from fake_useragent import UserAgent

class RandomUserAgentMiddleware:
    def process_request(self, request, spider):
        request.headers.setdefault("User-Agent", UserAgent().chrome)

下面这个代码写在settings.py文件里边,如下所示:

settings.py
DOWNLOADER_MIDDLEWARES = {
   # 'anjuke.middlewares.RandomProxyMiddleware': 543,
   'anjuke.middlewares.RandomUserAgentMiddleware': 400,
}

三、总结

大家好,我是皮皮。这篇文章基于粉丝提问,针对Scrapy框架中如何更改下载中间件里的headers问题,给出了具体说明和演示,顺利的帮助粉丝解决了问题。

最后感谢粉丝【麦当】提问,感谢【dcpeng】和【小王】大佬给出的示例和代码支持。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

盘点CSV文件在Excel中打开后乱码问题的两种处理方法

大家好,我是Python进阶者。前几天给大家分享了一些乱码问题的文章,阅读量还不错,感兴趣的小伙伴可以前往:盘点3种Python网络爬虫过程中的中文乱码的处理方法,UnicodeEncodeError: ‘gbk’ codec can’t encode character解决方法,今天基于粉丝提问,给大家介绍CSV文件在Excel中打开后乱码问题的两种处理方法,希望对大家的学习有所帮助。

前言

前几天有个叫【RSL】的粉丝在Python交流群里问了一道关于CSV文件在Excel中打开后乱码的问题,如下图所示。

在Excel中直接打开csv文件,如下图所示:

群中提问:

看上去确实头大,对于爬虫初学者来说,这个乱码摆在自己面前,犹如拦路虎一般难顶。不过别慌,小编在这里给大家整理了两种方法,专门用于针对CSV文件乱码的,希望大家在后面再次遇到这样乱码的问题,在此处可以得到灵感!

一、思路

其实解决问题的关键点就是在于一点,就是编码的转换。这里例举两种方法,肯定还有其他的方法的,也欢迎大家在评论区谏言。

二、解决方案

方法一:notepad++打开

因为csv文件本质上也是文本文件,本身用notepad++打开csv文件是可以直接打开,不会乱码的。如果在网络爬虫的时候,指定了存储格式为utf-8编码,那么该csv文件用notepad++打开是没啥问题的。

f = open('filename.csv', mode='a', encoding="utf-8")
csvwriter = csv.writer(f)

如下图所示:

因为我源文件本身就是韩语和日本语,所以看到的就是这个了,上图绝不是乱码哈,别误导了大家,嘻嘻!

方法二:Excel转换

这个方法稍微复杂一些,但是比较好理解,对于初学者来说,还是比较好接受的,直接在Excel中进行操作,步骤如下。

1)打开一个Excel文件,之后依次点击“数据”–>“从文本/CSV”,如下图所示。

2)之后选择需要加载的CSV文件,然后会自动弹出下图

从这里看的是原始文件,确实是乱码的存在,接下来需要稍微设置下就可以了。

3)文件原始格式设置为“无”或者你的原始编码“UTF-8”;分隔符默认是逗号;数据类型检测选择基于整个数据集,最后选择右下方的加载,如下图所示。

4)之后稍等片刻,CSV文件就会自动加载到Excel,如下图所示。

因为我源文件本身就是韩语和日本语,所以看到的就是这个了。

5)在Excel中的显示,如下图所示:

看上去还是比较清爽的,如此一来,中文乱码的问题就迎刃而解了。之后你就可以进行进一步的转存为标准的Excel文件或者进行数据处理都可以。

三、总结

我是Python进阶者。本文基于粉丝提问,针对CSV文件在Excel中打开后乱码问题,给出了两种乱码解决方法,顺利帮助粉丝解决了问题。虽然文中例举了两种方法,但是小编相信肯定还有其他的方法的,也欢迎大家在评论区谏言。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

【一、项目简介】

本文主要目标是采集淘宝的评价,找出客户所需要的功能。统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等。

 

【二、项目准备工作】

1. 准备Pycharm,下载安装等,可以参考这篇文章:Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

2. 爬取商品地址,如下所示:

https://detail.tmall.com/item.htm?spm=a230r.1.14.1.55a84b1721XG00&id=552918017887&ns=1&abbucket=17

3. 需要下载几个库,如何下载呢?

打开pycharm软件点击File在点击setting选项,再选择Project:你的文件名下边的Project:Interpreter选项。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

点击+号,安装这个项目需要用的库,例如:requests、beautifulsoup4、simplejson。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

 

【三、项目实现】

1. 导入需要的库

import requests
from bs4 import  BeautifulSoup as bs
import json
import csv
import re

2. 需要登录淘宝网,选择谷歌浏览器选择开发者工具或按F12有个Network选项,查找list_detail_rate.htm?文件

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

定义一个变量存储URL地址PAGE_URL = []

定义一个生成链接列表函数,使用字符串拼接形成评论的页数

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

定义一个获取评论数据函数内定义需要用到的字段例如:用户名、评论时间、颜色分类、评论,如下图所示。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)
一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

那个cookie值在在开发者工具Network有个item.htm?spm文件有个cookie复制过来就好了。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

解析JS文件内容、将数据写入TEXT文件中,如下图所示。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)
一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

最后定义一个主函数爬取需要的评论页数,如下图所示。

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

最后得到的结果如图所示:

一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

 

【四、总结】

1. 本文基于Python网络爬虫,采集了淘宝商品的评价,方法行之有效。但是建议不要抓取太多,以免对服务器造成压力。

2. 如果需要本文源码,请在公众号后台回复“淘宝评论”获取。

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

——————- End ——————-

往期精彩文章推荐:

手把手用Python教你如何发现隐藏wifi

手把手教你用Python做个可视化的“剪刀石头布”小游戏

手把手用Python网络爬虫带你爬取全国著名高校附近酒店评论

在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章:

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

关于Scrapy爬虫项目运行和调试的小技巧(上篇)

关于Scrapy爬虫项目运行和调试的小技巧(下篇)

今天我们将介绍在Scrapy中如何利用Xpath选择器从HTML中提取目标信息。在Scrapy中,其提供了两种数据提取的方式,一种是Xpath选择器,一种是CSS选择器,这一讲我们先聚焦Xpath选择器,仍然是以伯乐在线网为示例网站。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

1、 打开网站,然后随机选择任意一篇文章进行查看,如下图所示。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

我们需要提取的信息主要有标题、日期、主题、评论数、正文等等。

2、接下来我们就可以开始写代码了,基础代码如下图所示,需要注意的是start_urls参数值改为了具体的URL,其他的代码未发生改变。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

3、回到原始网页,按下键盘的快捷键F12或者在网页上点击鼠标右键,然后选择“检查(N)”弹出网页的调试界面,如下图所示。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

4、点击下图中红色框框的小图标,可以实现网页数据和源码之间的交互,可以很方便的帮助我们定位标签。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

5、如下图所示,当我们选择上图中的小图标之后,再选择网页上的标题,尔后网页源码会自动跳转到我们定位的部分,可以看到标题在<h1>标签下。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

6、尔后我们就可以根据上图中的网页层次结构写出标题的Xpath表达式,这里先提供一种比较笨的方法,从头到尾进行罗列的写,“/html/body/div[1]/div[3]/div[1]/div[1]/h1”,有没有发现灰常的辛苦,像这种大标题信息还比较好提取一些,若是碰到犄角旮旯的信息,就比较难写表达式了,而且这种方式容易出错,效率还低。不过小伙伴们不用灰心,浏览器给我们提供了一个便捷的方式,让我们可以直接复制Xpath表达式。在标题处或者目标信息处右键,然后选择“Copy”,再选择“Copy Xpath”即可进行复制该标签的Xpath表达式,具体过程如下图所示。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

可以看到复制的Xpath表达式为“//*[@id=”post-113659″]/div[1]/h1”,其中id=”post-113659″是属于这篇文章的一个标识,如下图所示。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

通过该标识我们就可以很快的定位到标签,其与我们用笨方法手动写出来的Xpath表达式有时候并不是一致的。下面将两个Xpath表达式所匹配的内容分别进行输出。

7、将Xpath表达式写入Scrapy爬虫主体文件中,尔后Debug我们之前定义的main.py文件,将会得到下图的输出。可以看到selector1和selector2中的数据即是网页上的内容,而且内容是一致的。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

之后点击停止Debug模式,便可以退出Debug模式。

8、从上图中我们可以看到选择器将标签<h1></h1>也都取出来了,而我们想要取的内容仅仅是标签内部的数据,此时只需要使用在Xpath表达式后边加入text()函数,便可以将其中的数据进行取出。

在Scrapy中如何利用Xpath选择器提取目标信息(两种方式)

通过这篇文章,我们可以了解到尽管我们自己写出的Xpath表达式和浏览器给我们返回的Xpath表达式在写法上并不一致,但是程序运行之后,其返回的数据内容是一致的。换句话说,关于某个目标数据的Xpath表达式并不是唯一的,只要符合Xpath表达式语法,即便是写的很短,也是没问题的,你开心就好。此外在Scrapy爬虫框架中,text()函数常常与Xpath表达式运用在一块,用于提取节点中的数据内容。

——————— End ———————

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

一篇文章带你学会两个场景下Selenium爬取动态网页小技巧

/1 前言/

selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,是爬复杂动态网页的必备工具。支持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。

这里分两个场景,给大家介绍Selenium爬动态网页小技巧。

/2 场景一:替换日期控件值/

以12306网站为例,如下图所示,按照正常的方法,我们首先要定位到时间元素,然后调用selenium的click()方法进行点击。

一篇文章带你学会两个场景下Selenium爬取动态网页小技巧

这种操作也是可行的。但是,过了一段时间,我们再次运行自动化代码的时候,就会发现功能运行不正常。因为日期更改后,日历控件布局发生了变化,而且操作起来很麻烦。

我们先看一下日期框的元素,如下图所示:

一篇文章带你学会两个场景下Selenium爬取动态网页小技巧

重点看一下value=‘text’,这种属性值可以通过JavaScript来改变,三行代码就能解决这个问题,如下图所示:

一篇文章带你学会两个场景下Selenium爬取动态网页小技巧

第一行是要输入的日期,第二行是JavaScript代码,“documen.getElementById”是通过HTML的“id”定位元素,通过改变该元素的“value”实现值的变化。

/3 场景二:动态网页自动下拉/

一些复杂的动态网页需要下拉才能把元素显示完全,例如腾讯视频主页,如下图所示:

一篇文章带你学会两个场景下Selenium爬取动态网页小技巧

如果需要自动爬取这类动态网页,我们同样可以执行JavasScript的方法来实现,用5行代码就可以连续滑动网页,将动态网页元素全部展示出来,代码如下图所示:

一篇文章带你学会两个场景下Selenium爬取动态网页小技巧

小编这里采取的分步下拉的方法,每次滚动1/10,“window.scrollTo”为向下滑动的命令,“document.body.clientHeight”为整个窗口的高度,“h=(i/10)”为每次滑动的高度。

效果演示如下:

/4 结语/

将JavaScript应用到selenium中可以帮我们解决很多问题,这里举两个小例子只是抛砖引玉,希望大家以后遇到selenium不好解决的问题时可以考虑在JavaScript身上寻找突破。

欢迎大家积极尝试,消耗在家的无聊时间。本文涉及的代码都上传到了github地址上,后台回复“selenium”这个单词即可获取代码。

——————— End ———————

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

网页结构的简介和Xpath语法的入门教程

相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章如何利用Xpath抓取京东网商品信息以及Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结。今天小编继续给大家介绍一些Xpath知识点,希望对大家的学习有帮助。

1、Xpath让我们可以使用一种类似于Windows下的文件路径的方式,让我们可以定位到HTML或者XML结构中的具体元素。Xpath本身包含标一些准函数库,可以让我们的Xpath语法更加强大。

网页结构的简介和Xpath语法的入门教程

2、在HTML结构中,有一定的层级关系,主要的关系包括:父节点、子节点、同胞节点(兄弟节点)、先辈节点、后代节点。

网页结构的简介和Xpath语法的入门教程

一般的,像类似于这种结构,称之为一个节点。如上图,根据层次关系,我们可以知道节点是的父节点,相应的,节点是节点的子节点。同胞节点又叫兄弟节点,一般的处于同级层次的节点叫同胞节点,如上图中的节点和第一个

节点、177~181行的

标签都是属于同胞节点。先辈节点又叫祖先节点,一般的,一个节点的上层以上的节点均称为先辈节点,所以父节点也是属于先辈节点的一种。基于此,我们又可以称节点是的先辈节点。相对应的,一个节点的下层以下的节点均称为后代节点,所以子节点也是属于后代节点的一种。基于此,我们又可以称节点是节点的后代节点。

3、理解这些节点之间的关系之后,可以方便我们更好的理解Xpath语法,下表是部分常用的Xpath语法。

网页结构的简介和Xpath语法的入门教程

这里特别强调“/”和“//”的区别,“/”一般代表的某个元素的子节点,而不是全部的后代节点;而“//”一般代表的某个元素的后代节点,范围比“/”代表的要更加广泛一些。@符号后边时常跟着class,代表选取名为class属性的节点,比较常见。

4、下面针对具体的网页源码,让大家了解一下网页结构。

网页结构的简介和Xpath语法的入门教程

如上图中的红色框框中,class为属性,而等于号后边的“grid-5”即为属性值,有的时候节点内不只是一个属性,如上图中的196行中,就有两个属性。

5、为了更加方便的定位到div或者其他节点下的标签,我们需要继续进一步的进行定位锁定,下表是部分常用的Xpath语法。

网页结构的简介和Xpath语法的入门教程

掌握了Xpath语法知识之后,我们就可以通过Xpath语法来进行编写Xpath表达式,以提取网页上的目标数据。

网页结构的简介和Xpath语法的入门教程

千里之行,始于足下。如果想学好Xpath,更是需要勤加使用,下一篇文章将给大家介绍Xpath在Scrapy爬虫项目中的使用。

——————- End ——————-

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

前几天给大家分享了如何在Windows下创建网络爬虫虚拟环境及如何安装Scrapy,还有Scrapy安装过程中常见的问题总结及其对应的解决方法,感兴趣的小伙伴可以戳链接进去查看。关于Scrapy的介绍,之前也在文章中提及过,今天小编带大家进入Scrapy爬虫框架,创建Scrapy爬虫框架的第一个项目,具体过程如下所示。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

1、进入虚拟环境,不知道进入的环境的小伙伴可以戳这篇文章:在Windows下如何创建指定的虚拟环境和在Windows下如何创建虚拟环境(默认情况下)。进入到环境之后可以通过“pip list”命令查看Scrapy是否安装成功,如下图所示。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

可以看到Scrapy已经安装成功。

2、这里小编欲将Scrapy项目放到demo文件夹下,所以先退回到上级目录中去,如下图所示。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

3、尔后开始新建Scrapy项目,输入创建Scrapy爬虫项目命令“scrapy startproject article”,其中article是爬虫项目的名称,可以自行更改的。输入创建命令之后,稍等片刻,系统会根据模板进行创建项目,模板所在的目录是“D:\pythonDemo\2018\September\demo\scrapy_demo\Lib\site-packages\scrapy\templates\project”,与你的爬虫环境相关,如下图所示,等待项目创建完成。当然我们可以自定义爬虫模板,不过目前来看,Scrapy爬虫框架提供的模板够我们用的了,我们能把Scrapy搞明白也就可以了。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

4、根据上图提示,首先进入到article文件夹下,输入命令“cd article”,之后通过“dir”查看目录,也可以通过“tree /f”生成文件目录的树形结构,如下图所示,可以很清晰的看到Scrapy创建命令生成的文件。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

顶层的article文件夹是项目名。

第二层中包含的是一个与项目名同名的文件夹article和一个文件scrapy.cfg,这个与项目同名的文件夹article是一个模块,所有的项目代码都在这个模块内添加,而scrapy.cfg文件是整个Scrapy项目的配置文件。

第三层中有5个文件和一个文件夹,其中__init__.py是个空文件,作用是将其上级目录变成一个模块;items.py是定义储对象的文件,决定爬取哪些项目;middlewares.py文件是中间件,一般不用进行修改,主要负责相关组件之间的请求与响应;pipelines.py是管道文件,决定爬取后的数据如何进行处理和存储;settings.py是项目的设置文件,设置项目管道数据的处理方法、爬虫频率、表名等;spiders文件夹中放置的是爬虫主体文件(用于实现爬虫逻辑)和一个__init__.py空文件。

5、在Windows文件夹下也可以很清晰的看到新建的Scrapy文件,如下图所示。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

6、当然,也可以通过Pycharm导入项目的方式进行查看项目文件,此时更加的清晰,如下图所示。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

7、点击各个项目文件,可以查看其中的内容,其中settings.py文件的内容如下图所示,其他的文件内容在此就不再赘述了。

手把手教你如何新建scrapy爬虫框架的第一个项目(上)

至此,第一个Scrapy爬虫项目的创建及Scrapy爬虫项目中的文件解析介绍就先到这里了,下一步开始进行Scrapy爬虫项目的进阶内容,敬请期待~~

——————— End ———————

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

一篇文章带你了解网络爬虫的概念及其工作原理

众所周知,随着计算机、互联网、物联网、云计算等网络技术的风起云涌,网络上的信息呈爆炸式增长。毋庸置疑,互联网上的信息几乎囊括了社会、文化、政治、经济、娱乐等所有话题。使用传统数据收集机制(如问卷调查法、访谈法)进行捕获和采集数据,往往会受经费和地域范围所限,而且还会因其样本容量小、信度低等因素导致收集的数据往往与客观事实有所偏颇,有着较大的局限性。

一篇文章带你了解网络爬虫的概念及其工作原理

网络爬虫通过统一资源定位符URL (Uniform ResourceLocator)来查找目标网页,将用户所关注的数据内容直接返回给用户,并不需要用户以浏览网页的形式去获取信息,为用户节省了时间和精力,并提高了数据采集的准确度,使用户在海量数据中游刃有余。网络爬虫的最终目的就是从网页中获取自己所需的信息。虽然利用urllib、urllib2、re等一些爬虫基本库可以开发一个爬虫程序,获取到所需的内容,但是所有的爬虫程序都以这种方式进行编写,工作量未免太大了些,所有才有了爬虫框架。使用爬虫框架可以大大提高效率,缩短开发时间。

一篇文章带你了解网络爬虫的概念及其工作原理

网络爬虫(web crawler)又称为网络蜘蛛(web spider)或网络机器人(web robot),另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或蠕虫,同时它也是“物联网”概念的核心之一。网络爬虫本质上是一段计算机程序或脚本,其按照一定的逻辑和算法规则自动地抓取和下载万维网的网页,是搜索引擎的一个重要组成部分。

一篇文章带你了解网络爬虫的概念及其工作原理

网络爬虫一般是根据预先设定的一个或若干个初始网页的URL开始,然后按照一定的规则爬取网页,获取初始网页上的URL列表,之后每当抓取一个网页时,爬虫会提取该网页新的URL并放入到未爬取的队列中去,然后循环的从未爬取的队列中取出一个URL再次进行新一轮的爬取,不断的重复上述过程,直到队列中的URL抓取完毕或者达到其他的既定条件,爬虫才会结束。具体流程如下图所示。

一篇文章带你了解网络爬虫的概念及其工作原理

随着互联网信息的与日俱增,利用网络爬虫工具来获取所需信息必有用武之地。使用网络爬虫来采集信息,不仅可以实现对web上信息的高效、准确、自动的获取,还利于公司或者研究人员等对采集到的数据进行后续的挖掘分析。

一篇文章带你了解网络爬虫的概念及其工作原理

—–——— End ————-

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

网络爬虫过程中5种网页去重方法简要介绍

一般的,我们想抓取一个网站所有的URL,首先通过起始URL,之后通过网络爬虫提取出该网页中所有的URL链接,之后再对提取出来的每个URL进行爬取,提取出各个网页中的新一轮URL,以此类推。整体的感觉就是自上而下进行抓取网页中的链接,理论上来看,可以抓取整站所有的链接。但是问题来了,一个网站中网页的链接是有环路的。

网络爬虫过程中5种网页去重方法简要介绍

举个栗子,在网站首页中我们可以看到首页这个链接,之后我们在子网页中也有可能会看到有个链接是指向首页的,可能子子网页还会有对应的链接指向首页。按照我们之前的逻辑,抓取每个网页中的所有链接,之后对所有的链接继续抓取。就拿首页来说,我们首先抓取的就是它,尔后子网页中又有个链接指向首页,子子网页还有链接指向首页,如此进行抓取,岂不是会导致网页重复抓取,其他的网页根本就没有机会去抓取了,简直不敢想象~~要解决这个问题并不难,此时就需要用到网络爬虫中了一个重要的知识点,就是网页去重。

网络爬虫过程中5种网页去重方法简要介绍

首先介绍一个简单的思路,也是经常用的一个通用思路。我们将已经爬取过的网页放到一个列表中去,以首页为例,当首页被抓取之后,将首页放到列表中,之后我们抓取子网页的时候,如果再次碰到了首页,而首页已经被抓取过了,此时就可以跳过首页,继续往下抓取其他的网页,而避开了将首页重复抓取的情况,这样下来,爬取整站就不会出现一个环路。以这个思路为出发点,将访问过的URL保存到数据库中,当获取下一个URL的时候,就去数据库中去查询这个URL是否已经被访问过了。虽然数据库有缓存,但是当每个URL都去数据库中查询的话,会导致效率下降的很快,所以这种策略用的并不多,但不失为最简单的一种方式。

第二种方式是将访问过的URL保存到set中去,通过这样方式获取URL的速度很快,基本上不用做查询。但是这种方法有一个缺点,将URL保存到set中,实际上是保存到内存中,当URL数据量很大的时候(如1亿条),会导致内存的压力越来越大。对于小型的爬虫来说,这个方法十分可取,但是对于大型的网络爬虫,这种方法就难以企及了。

网络爬虫过程中5种网页去重方法简要介绍

第三种方式是将字符进行md5编码,md5编码可以将字符缩减到固定的长度。一般来说,md5编码的长度约为128bit,约等于16byte。在未缩减之前,假设一个URL占用的内存大小为50个字节,一个字节等于2byte,相当于100byte。由此可见,进行md5编码之后,节约了大量的内存空间。通过md5的方式可以将任意长度的URL压缩到同样长度的md5字符串,而且不会出现重复的情况,达到去重的效果。通过这种方式很大程度上节约了内存,scrapy框架采取的方式同md5方式有些类似,所以说scrapy在正常情况下,即使URL的数量级达到了上亿级别,其占用的内存比起set方式也要少得多。

网络爬虫过程中5种网页去重方法简要介绍

第四种方式是使用bitmap方法将字符进一步压缩。这种方式的意思是在计算机中申请8个bit,即8个位,每个位由0或者1表示,这是计算机中最小的单元。8个位组成1个byte,一个位代表一个URL的话,为什么一个位可以确定一个URL呢?因为我们可以将一个URL进行一个哈希函数,然后将其映射到位上面去。举个栗子,假设我们有8个URL,分别对应8个位,然后通过位上面的0和1的状态,便可以表明这个URL是否存在,通过这种方法便可以进一步的压缩内存。

网络爬虫过程中5种网页去重方法简要介绍

但是bitmap方法有一个非常大的缺点,就是它的冲突会非常高,因为同用一个哈希函数,极有可能将两个不同的URL或者多个不同的URL映射到一个位置上来。实际上这种哈希的方法,它也是set方式的一种实现原理,它将URL进行一种函数计算,然后映射到bit的位置中去,所以这种方式对内存的压缩是非常大的。简单的来计算一下,还是以一亿条URL来进行计算,相当于一亿个bit,通过计算得到其相当于12500000byte,除以1024之后约为12207KB,大概是12MB的空间。在实际过程中内存的占用可能会比12MB大一些,但是即便是如此,相比于前面三种方法,这种方式以及大大的减少了内存占用的空间了。但是与此同时,该方法产生冲突的可能性是非常大的,所以这种方法也不是太适用的。那么有没有方法将bitmap这种对内存浓重压缩的方法做进一步优化,让冲突的可能性降下来呢?答案是有的,就是第五种方式。

网络爬虫过程中5种网页去重方法简要介绍

第五种方式是bloomfilter,该方法对bitmap进行改进,它可以通过多个哈希函数减少冲突的可能性。通过这种方式,一方面它既可以达到bitmap方法减少内存的作用,另一方面它又同时起到减少冲突的作用。关于bloomfilter原理及其实现,后期肯定会给大家呈上,今天先让大家有个简单的认识。Bloomfilter适用于大型的网络爬虫,尤其是数量级超级大的时候,采用bloomfilter方法可以起到事半功倍的效果,其也经常和分布式爬虫共同配合,以达到爬取的目的。

网络爬虫过程中5种网页去重方法简要介绍

关于网络爬虫过程中去重策略的五种方式的介绍就先到这里了,不懂的就当了解一下了,问题不大,希望对小伙伴们的学习有所帮助。

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

浅谈网络爬虫中广度优先算法和代码实现

前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章——浅谈网络爬虫中深度优先算法和简单代码实现。今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码实现过程。

浅谈网络爬虫中广度优先算法和代码实现

广度优先算法和深度优先算法恰好相反,这里继续以上图的二叉树为例。广度优先算法的主要思想是首先从顶级域名A开始,之后从中提取出两个链接B和C,待链接B抓取完成之后,下一个要抓取的链接则是链接B的同级兄弟链接C,而不是说抓取完成链接B之后,立马往下去抓取子链接C或D。待C抓取完成之后,再返回去继续抓取兄弟链接B下的子链接D或者E,尔后再返回去抓取C链接下的兄弟链接F、G、H,以此类推。

浅谈网络爬虫中广度优先算法和代码实现

从面上看去,广度优先算法是一种以分层的方式进行抓取的策略。首先将第一层的节点抓取完成,尔后抓取第二层的节点,再是依次抓取第三层的节点,以此类推,直到抓取完毕或者达到既定的抓取条件为止。可以认为广度优先算法是一种按照层次的方法进行遍历,所以也被称为宽度优先算法。理解好广度优先算法之后,再来看上图,可以得到该二叉树呈现的爬虫抓取链接的顺序依次为:A、B、C、D、E、F、G、H 、I(这里假设左边的链接先会被爬取)。通过上面的理解,我们可以认为到广度优先算法本质上是通过队列的方式来进行实现的。

浅谈网络爬虫中广度优先算法和代码实现

下图展示的是广度优先算法的代码实现过程。

浅谈网络爬虫中广度优先算法和代码实现

最开始传入一个顶节点node(链接A),然后判断节点是否非空,如果为空,则返回,反之非空的话,则将其放入到一个队列列表中,然后开始进行循环。对队列列表中的元素(此时只有节点A)使用pop()方法将其进行取出,然后将该节点的数据进行打印。将节点打印完成之后,看看其是否存在左节点(链接B)和右节点(链接C),如果左节点非空的话,则得到新的左节点(链接B),将其放入到队列列表中去。尔后程序继续往下执行,右节点的实现过程亦是如此,此时将得到右节点(链接C),将其也放入到队列列表中去。此时队列列表中的元素有链接B和链接C,之后再次进行新一轮的循环。通过这种方式,我们便实现了广度优先算法中的分层抓取链接的过程。这个逻辑相对于深度优先算法来说,更为简单。

浅谈网络爬虫中广度优先算法和代码实现

深度优先算法和广度优先算法是数据结构里边非常重要的一种算法结构,也是非常常用的一种算法,而且在面试过程中也是非常常见的一道面试题,所以建议大家都需要掌握它。

浅谈网络爬虫中广度优先算法和代码实现

关于网络爬虫中广度优先算法的简单介绍就到这里了,小伙伴们get到木有咧?

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】