《数据采集与预处理》课件 项目二 网络爬虫实践_第1页
《数据采集与预处理》课件 项目二 网络爬虫实践_第2页
《数据采集与预处理》课件 项目二 网络爬虫实践_第3页
《数据采集与预处理》课件 项目二 网络爬虫实践_第4页
《数据采集与预处理》课件 项目二 网络爬虫实践_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目二网络爬虫实践言示网66网站原创,侵权必究Project2WebCrawlerPractice任务一Task1言示网66网站原创,侵权必究使用urllib爬取北京公交线路的信息言示网66网站原创,侵权必究任务描述(1)学习网络爬虫相关技术,熟悉爬虫基本库urllib的使用。(2)熟悉网络爬虫相关基础知识。(3)使用urllib基本库获取北京公交线路信息的HTML源代码。(4)使用BeautifulSoup解析库完成北京公交线路相关信息的获取。

任务目标(1)知道urllib基本库和BeautifulSoup解析库的使用方法。(2)学会使用urllib基本库和BeautifulSoup解析库进行北京公交线路相关信息的爬取。言示网66网站原创,侵权必究知识准备1.HTTP的理解(1)URL和URI

统一资源定位符(UniformResourceLocator,URL)和统一资源标识符(UniformResourceIdentifier,URI)用于精确地说明某资源的位置以及如何去访问它。URI有两种表现形式——URL和统一资

源名称(UniformResourceName,URN)。URL描述了一台特定服务器上某资源的特定位置;URN仅命名资源而不指定如何定位资源,在目前的互联网中使用得很少。因此,几乎所有的URI都是URL。(2)HTTP和HTTPS

爬虫常用的协议类型就是HTTP和HTTPS。超文本传输协议(HyperTextTransferProtocol,HTTP)是一个客户端和服务器端请求和应答的标准,是互联网中应用最为广泛的一种网络协议,所有的WWW文件都要遵守这个协议,目前广泛使用的是HTTP1.1。HTTPS是以安全为目标的HTTP通道,可以理解为HTTP的安全版,即HTTP中加入SSL层,其传输的内容都是经过SSL加密的,它的主要作用如下:建立一个信息安全通道,来保证数据的传输安全;确认网站的真实性,凡是使用了HTTPS的网站,用户都可以通过单击浏览器地址栏中的锁头标志来查看网站认证之后的真实信息,也可以通过证书颁发机构颁发的安全签章来查询。言示网66网站原创,侵权必究知识准备1.HTTP的理解(3)HTTP请求流程

一次HTTP操作称为一个事务,其工作过程可分为以下4步。首先,在浏览器地址栏中输入一个地址(或单击一个超链接),HTTP的工作就开始了。其次,建立连接后,客户端发送一个HTTP请求到服务器,请求消息由请求行、请求头部、空行和请求数据4部分组成。再次,服务器接收到请求后,给出响应,HTTP响应也由4部分组成,分别是状态行、消息报头、空行和响应正文。最后,客户端浏览器接收响应之后,在用户的浏览器上渲染显示,客户端和服务器端断开连接。图2-1请求报文的一般格式言示网66网站原创,侵权必究知识准备2.网页基础知识(1)网页的组成网页的组成可分为三大部分:超文本标记语言(HyperTextMarkupLanguage,HTML)、层叠样式表(CascadingStyleSheets,CSS)和Java脚本(JavaScript,JS)。HTML负责语义,CSS负责样式,JavaScript负责交互和行为。HTML:用来描述网页的一种语言。可以通过Chrome浏览器打开一个网址,右键单击检查或按F12键,打开“开发者工具”,选择“Elements”选项卡,即可看到网页的源代码。CSS:“层叠”是指当在HTML中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理;“样式”指网页中文字大小、颜色、元素间距、排列等格式。JavaScript:一种脚本语言。HTML和CSS配合使用,提供给用户的只是一种静态的信息,缺少交互性。有时在网页中可能会看到一些交互和动画效果,如下载进度条、提示框、轮播图等,这通常需要使用JavaScript来实现。网页的基本格式如图言示网66网站原创,侵权必究知识准备2.网页基础知识(2)节点树及节点间的关系在网页中,组织页面的对象被渲染成一个树形结构,用来表示文档中对象的标准模型,称为文档对象模型(DocumentObjectModel,DOM)。DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、对象的行为和属性,以及对象之间的关系。可以把DOM看作页面上数据和结构的一个树形表示,只是页面可能并不是以这种树的方式具体实现的。节点树示意如图2-2所示。图2-2节点树示意言示网66网站原创,侵权必究知识准备2.网页基础知识①在节点树中,顶端节点被称为根。②每个节点都有父节点,除了根(即根节点,没有父节点)。③一个节点可拥有任意数量的子节点。④兄弟是拥有相同父节点的节点。DOM规定:整个文档是一个文档节点,每个HTML标签是一个元素节点,包含在HTML元素中的文本是文本节点,每一个HTML属性是一个属性节点,注释属于注释节点。节点树中的节点彼此拥有层级关系。父(Parent)、子(Child)和兄弟(Sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为兄弟(同胞或姐妹)。如图

节点树的一部分及节点之间的关系言示网66网站原创,侵权必究知识准备3.爬虫的基本原理网络爬虫(又被称为网页蜘蛛)本质上就是获取网页并提取和保存信息的自动化程序。(1)获取网页爬虫的首要工作就是获取网页源代码,再从中提取想要的数据。在Python中提供了许多库来帮助实现这个操作,如urllib、requests等,使用这些库可以帮助实现HTTP请求操作,Request和Response都可以用类库提供的数据结构来表示,得到Response之后只需要解析数据结构中的body部分,即可得到网页的源代码,这样便可以用程序来实现获取网页的过程。(2)提取信息获取网页源代码后,接下来的工作就是分析网页源代码,从中提取想要的数据。最通用的方法就是使用正则表达式,但是使用正则表达式比较复杂。在Python中,使用BeautifulSoup、PyQuery、LXML等库,可以帮助用户高效地从源代码中提取网页信息。(3)保存数据提取信息之后,可以将数据保存到本地,以便后续使用。保存方式有很多种,如TXT、JSON,也可以保存到数据库中,如MySQL、MongoDB等。言示网66网站原创,侵权必究知识准备4.基本库的使用(1)urllib库的使用urllib库是Python中的一个功能强大、用于操作URL,并在制作爬虫的时候经常要用到的库。同样的库还有requests、httplib2。在Python2中,分别有urllib和urllib2,但在Python3中,其统一合并到urllib中。相对来说,Python3对中文的支持比Python2友好,urllib是Python3内置的HTTP请求库,它包含4个模块:request:最基本的HTTP请求模块,可以用来模拟发送请求。error:异常处理模块,如果出现请求错误,可以捕获异常,然后进行重试或其他操作。parse:工具模块,提供了许多URL处理方法,如拆分、解析、合并等。robotparser:主要用于识别网站的rebots.txt文件,然后判断哪些网页可以爬,哪些网页不可以爬。①

发送请求其先导入urllib.request模块,使用urlopen()对参数中的URL发送请求,返回一个HTTP.client.HTTPResponse对象。言示网66网站原创,侵权必究知识准备4.基本库的使用

在urlopen()中,使用timeout字段,可设定相应的秒数时间之后停止等待响应。除此之外,还可使用()、r.getcode()、r.geturl()获取相应的当前环境信息、状态码、当前网页URL。②读取响应内容HTTP.client.HTTPResponse对象包含了read()、readinto()、getheader(name)、getheaders()等方法,以及msg、version、status、reason、debuglevel等属性。

使用r.read()读取响应内容到内存中,该内容为网页的源代码(可用相应浏览器的“查看网页源代码”功能查看),并可对返回的字符串进行相应解码,即decode()。言示网66网站原创,侵权必究知识准备4.基本库的使用以字符串字典的形式,通过urlencode()编码,为URL的查询字符串传递数据,编码后的params为字符串,字典每项键值对以'&'连接,如'q=urllib&check_keywords=yes&area=default',构建后的URL为HTTPS:///3/search.html?q=urllib&check_keywords=yes&area=default。当然,urlopen()支持直接构建的URL,简单的GET请求可以不通过urlencode()编码,手动构建后直接请求即可。③传递URL参数言示网66网站原创,侵权必究知识准备4.基本库的使用该URL利用“baidu”图片接口,查询关键字“word”的图片。如果直接将中文传入URL进行请求,会导致编码错误。因此需要使用quote()对该中文关键字进行URL编码,相应的,可以使用unquote()进行解码。⑤定制请求头③传递中文参数言示网66网站原创,侵权必究知识准备4.基本库的使用有时爬取一些网页时,会出现403错误(Forbidden),即禁止访问。这是因为网站服务器会对访问者的headers属性进行身份验证。例如,通过urllib库发送的请求,默认以“Python-urllib/X.Y”作为User-Agent,其中,X为Python的主版本号,Y为副版本号。所以,需要通过urllib.request.Request()构建Request对象,传入字典形式的headers属性,模拟浏览器。相应的headers信息,可通过浏览器的开发者调试工具,即“检查”功能的“Network”标签查看“标头”得到,或使用抓包分析软件Fiddler、Wireshark得到。除上述方法外,还可以使用urllib.request.build_opener()或req.add_header()定制请求头。在Python2中,urllib模块和urllib2模块通常一起使用,因为urllib.urlencode()可以对URL参数进行编码,而urllib2.Request()可以构建Request对象,定制请求头,并统一使用urllib2.urlopen()发送请求。言示网66网站原创,侵权必究知识准备4.基本库的使用⑥传递POST请求

在进行注册、登录等操作时,会通过POST表单传递信息。此时,首先,需要分析页面结构,构建表单数据post,使用urlencode()进行编码处理,返回字符串;其次,需要指定“UTF-8”的编码格式,这是因为postdata只能是bytes或者fileobject;最后,通过Request()传递postdata,使用urlopen()发送请求。言示网66网站原创,侵权必究知识准备4.基本库的使用⑦下载远程数据到本地

爬取图片、视频等远程数据时,可使用urlretrieve()将其下载到本地(不指定路径,默认存放到项目根目录)。其第一个参数为要下载的URL,第二个参数为下载后的存放路径。例如,下载Python官网Logo到当前目录中,返回元组(filename,http.client.HTTPMessage)。言示网66网站原创,侵权必究知识准备4.基本库的使用⑧设置代理IP地址

有时,频繁地爬取一个网页会被网站服务器屏蔽IP地址。此时,可通过上述方法设置代理IP地址。首先,通过网上代理IP地址的网站找一个可以用的IP地址,构建ProxyHandler()

对象,将HTTP和代理IP地址以字典形式作为参数传入,设置代理服务器的信息。再构建opener对象,将proxy和HTTPHandler类传入。通过install_opener()

将opener设置成全局对象,当使用urlopen()发送请求时,会使用之前设置的信息发送相应的请求。言示网66网站原创,侵权必究知识准备4.基本库的使用⑨异常处理URLError类来自urllib库的error模块,request模块产生的异常可以通过捕获这个类来处理。HTTPError是URLError的子类,用来处理HTTP请求错误,比如认证请求失败等。它有如下3个属性:

code:HTTP状态码。

reason:同父类一样,表示错误的原因。

headers:请求头因为URLError类是HTTPError的父类,所以在捕获异常时应先选择捕获子类的异常,再去捕获父类的异常。如果捕获到了HTTPError,则不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常。言示网66网站原创,侵权必究知识准备4.基本库的使用⑩Cookie的使用获取网站的Cookie。首先,必须声明一个CookieJar对象,然后利用HTTPCookieProcessor来构建一个Handler,最后利用build_opener()方法构建Opener。获取网站的Cookie并保存为文件。言示网66网站原创,侵权必究知识准备4.基本库的使用MozillaCookieJar是CookieJar的子类,可以用来处理Cookies和文件相关的事件(读取或保存Cookies等),将Cookies保存成Mozilla型浏览器的Cookies格式,运行之后将在当前目录下生成了一个cookies.txt文件。生成Cookies文件后,后续过程中会读取Cookies文件并进行利用。通过无状态协议HTTP访问网页时,Cookie会维持会话间的状态。例如,有些网站需要登录操作,第一次操作时可通过提交POST表单来登录,当爬取该网站中的其他站点时,可以使用Cookie来保持登录状态,而不用每次都通过提交表单来登录。言示网66网站原创,侵权必究知识准备4.基本库的使用(2)BeautifulSoupBeautifulSoup提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据。BeautifulSoup自动将输入文档转换为Unicode编码,将输出文档转换为UTF-8编码。一般而言,在处理时不需要考虑编码方式,除非文档没有指定一个编码方式。此时,BeautifulSoup无法自动识别编码方式,需要说明原始的编码方式。①

创建BeautifulSoup对象必须先导入bs4库,代码如下。创建一个字符串,代码如下。言示网66网站原创,侵权必究知识准备4.基本库的使用创建BeautifulSoup对象,代码如下。下面来输出soup对象的内容,使用格式化输出方式,代码如下。输出结果如下。言示网66网站原创,侵权必究知识准备4.基本库的使用②

四大对象种类BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象都可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment。a.Tag它就是HTML中的一个个标签,代码如下。这里的title和a标签加上其中包括的内容就是Tag。下面尝试用BeautifulSoup方便地获取Tag。以下每一段代码的注释部分即为运行结果。言示网66网站原创,侵权必究知识准备4.基本库的使用可以利用soup加标签名轻松地获取这些标签的内容,这里需要注意,其查找的是所有内容中的第一个符合要求的标签(查询所有标签的方法稍后会进行介绍)。下面来验证一下这些对象的类型,代码如下。对于Tag,它有两个重要的属性,分别是name和attrs。言示网66网站原创,侵权必究知识准备4.基本库的使用soup对象本身比较特殊,它的name即为[document],对于其他内部标签,其输出的值便为标签本身的名称。这里,输出了p标签的所有属性,得到的类型是一个字典。如果想要单独获取某个属性,则可以按以下方法来做,如获取对象的class属性。还可以利用get方法,传入属性的名称来获取属性的值,其类型为列表。此外,可以对这些属性和内容等进行修改,代码如下。言示网66网站原创,侵权必究知识准备4.基本库的使用b.NavigableString不仅可以得到标签的内容,还可以通过“.string”获取标签内部的文字,代码如下。这样可以轻松地获取标签中的内容,下面来检查其类型。c.BeautifulSoupBeautifulSoup对象表示的是一个文档的全部内容,大部分时候,可以将其当作一个特殊的Tag对象,可以分别获取它的类型、名称和属性。言示网66网站原创,侵权必究知识准备4.基本库的使用d.CommentComment对象是一个特殊类型的NavigableString对象,其输出的内容仍然不包括注释符号,但是如果不妥善地对其进行处理,则可能会给文本处理带来意想不到的麻烦。下面来查找一个带注释的标签。其运行结果如下。a标签中的内容实际上是注释,但是如果利用.string来输出其内容,将会发现它已经把注释符号去掉了,这样做可能会带来严重的问题。另外,输出其类型时,会发现它是Comment类型,所以,在使用前最好进行判断,代码如下。言示网66网站原创,侵权必究知识准备4.基本库的使用在上面的代码中,先判断了它的类型是否为Comment,再进行其他操作,如输出。③

遍历文档树a.遍历直接子节点Tag的.contents属性可以使Tag的子节点以列表的方式输出。输出方式为列表,可以用列表索引来获取它的某一个元素。言示网66网站原创,侵权必究知识准备4.基本库的使用.children返回的不是一个list,而是一个list生成器对象,可以通过遍历获取所有子节点。b.遍历所有子孙节点.contents和.children属性仅包含Tag的直接子节点,.descendants属性可以对所有Tag的子孙节点进行递归循环,其和.children类似,需要遍历获取其中的内容。言示网66网站原创,侵权必究知识准备4.基本库的使用其运行结果如下。可以发现,所有的节点都被打印出来了,先是最外层的html标签,再从head中将标签一个个剥离出来,以此类推。c.遍历节点内容如果Tag只有一个NavigableString类型的子节点,那么这个Tag可以使用.string得到子节点。如果一个Tag仅有一个子节点,那么这个Tag也可以使用.string方法,其输出结果与当前唯一子节点的.string的输出结果相同。简单来讲,如果一个标签中没有标签了,那么.string会返回标签中的内容。如果标签中只有唯一的一个标签,那么.string会返回最里面的内容。言示网66网站原创,侵权必究知识准备4.基本库的使用如果Tag包含了多个子节点,则Tag无法确定.string方法应该调用哪个子节点的内容,.string的输出结果是None。d.遍历多个内容.string可以通过遍历来获取多个内容,代码如下。言示网66网站原创,侵权必究知识准备4.基本库的使用其输出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白内容,代码如下。e.遍历父节点使用元素的

.parent属性可以获取父节点,代码如下。言示网66网站原创,侵权必究知识准备4.基本库的使用f.遍历全部父节点通过元素的.parents属性可以递归得到元素的所有父节点,代码如下g.遍历兄弟节点兄弟节点可以理解为和本节点处在同一级的节点,.next_sibling属性可获取该节点的下一个兄弟节点,.previous_sibling则与之相反,如果节点不存在,则返回None。言示网66网站原创,侵权必究知识准备4.基本库的使用h.遍历全部兄弟节点通过

.next_siblings和

.previous_siblings属性可以对当前节点的兄弟节点进行迭代输出。i.遍历前后节点与.next_sibling和.previous_sibling不同,.next_element并不是针对兄弟节点,而是针对所有节点,不分层次。那么head节点的下一个节点便是title,它是不分层次关系的。言示网66网站原创,侵权必究知识准备4.基本库的使用j.遍历所有前后节点通过.next_elements和.previous_elements的迭代器可以向前或向后访问文档的解析内容,就好像文档正在被解析一样。④

搜索文档树a.find_all(name,attrs,recursive,text,limit,**kwargs)find_all()方法用于搜索当前Tag的所有Tag子节点,并判断是否符合过滤器的条件。(a)name参数name参数可以查找所有名称为name的tag,字符串对象会被自动忽略。言示网66网站原创,侵权必究知识准备4.基本库的使用ⓐ传字符串:最简单的过滤器是字符串。在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容。下面的例子用于查找文档中所有的b标签。ⓑ传正则表达式:如果传入正则表达式作为参数,则BeautifulSoup会通过正则表达式的match()

来匹配内容。下面例子用于找出所有以b开头的标签,这表示body和b标签都应该被找到。言示网66网站原创,侵权必究知识准备4.基本库的使用ⓒ传列表:如果传入列表参数,则BeautifulSoup会将与列表中任一元素匹配的内容返回。下面的例子用于找到文档中所有a标签和b标签。ⓓ传True:True可以匹配任何值。下面的例子用于查找到所有的Tag,但是不会返回字符串节点。言示网66网站原创,侵权必究知识准备4.基本库的使用ⓔ传方法:如果没有合适的过滤器,还可以定义一个方法,此方法只接收一个元素参数(HTML文档中的一个元素节点,不能是文本节点),如果这个方法返回True,则表示当前元素匹配并且被找到,否则返回False。下面的例子用于校验当前元素,如果包含class属性却不包含id属性,那么将返回True。将这个方法作为参数传入find_all()

方法,将得到所有p标签。(b)attrs参数有些Tag属性在搜索中无法使用,如HTML5中的data-*属性。言示网66网站原创,侵权必究知识准备4.基本库的使用

但是可以通过find_all()

方法的attrs参数定义一个字典参数来搜索包含特殊属性的Tag,表达式可以是字符串、布尔值、正则表达式。(c)recursive参数调用Tag的find_all()

方法时,BeautifulSoup会检索当前Tag的所有子孙节点,如果只想搜索Tag的直接子节点,则可以使用参数recursive=False。是否使用recursive参数的搜索结果对比如下。言示网66网站原创,侵权必究知识准备4.基本库的使用(d)text参数通过text参数可以搜索文档中的字符串内容。与name参数的可选值一样,text参数可以为字符串、正则表达式、列表和True。(e)limit参数find_all()

方法返回全部的搜索结果,如果文档树很大,搜索就会很慢。如果不需要全部结果,则可以使用limit参数限制返回结果的数量。当搜索到的结果数量达到limit的限制时,就停止搜索返回结果。文档树中有3个Tag符合搜索条件,但结果只返回了2个,因为limit=2限制了返回数量。言示网66网站原创,侵权必究知识准备4.基本库的使用(f)**kwargs参数如果传入href参数,则BeautifulSoup会搜索每个Tag的href属性。使用多个指定名称的参数可以同时过滤Tag的多个属性。言示网66网站原创,侵权必究知识准备4.基本库的使用如果想用class进行过滤,则由于class是Python的关键词,因此需要为其加一个下划线来解决冲突问题。b.find_parents()与find_parent()find_parents()

在当前节点的先辈节点中搜索,返回列表类型,参数同.find_all()参数。而find_parent()

在当前节点的先辈节点中搜索,则返回一个结果,参数同.find()参数。言示网66网站原创,侵权必究知识准备4.基本库的使用c.find_next_sibling()与find_next_sibling()find_next_siblings()方法在后续平行节点中搜索,返回列表类型,参数同.find_all()参数。find_next_sibling()方法在后续平行节点中搜索,返回第一个符合条件的结果,参数同.find()参数。d.find_previous_siblings()与find_previous_sibling()find_previous_siblings()方法在前序平行节点中搜索,返回列表类型,参数同.find_all()参数。find_previous_sibling()方法在前序平行节点中搜索,返回第一个符合条件的结果,参数同.find()参数。言示网66网站原创,侵权必究知识准备4.基本库的使用e.find_all_next()与find_next()find_all_next()方法在当前节点之后的节点中搜索,返回列表类型,参数同.find_all()参数。find_next()方法在当前节点之后的节点中搜索,返回第一个符合条件的节点,参数同.find()参数。f.find_all_previous()与find_previous()find_all_previous()方法在当前节点之前的节点中搜索,返回列表类型,参数同.find_all()参数。find_previous()方法在当前节点之前的节点中搜索,返回第一个符合条件的节点,参数同.find()参数。言示网66网站原创,侵权必究知识准备4.基本库的使用⑤CSS选择器编写CSS时,标签名不加任何修饰,类名前加点,id名前加#,在这里也可以利用类似的方法来筛选元素,使用的方法是soup.select(),返回类型是list。a.通过标签名查找b.通过类名查找c.通过id名查找言示网66网站原创,侵权必究知识准备4.基本库的使用d.组合查找组合查找编写class文件时,标签名与类名、id名进行组合的原理是一样的,例如,查找p标签时,id等于elephant1的内容,两者需要用空格分开。e.直接子标签查找f.属性查找进行查找时,还可以加入属性元素,属性需要用中括号括起来。注意,属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配。言示网66网站原创,侵权必究知识准备4.基本库的使用同样,属性仍然可以与上述查找方式组合,不在同一节点的用空格隔开,在同一节点的不加空格。以上的select()方法返回的结果都是列表形式,可以遍历形式输出,并用get_text()方法来获取其内容。言示网66网站原创,侵权必究任务实施1.确定并分析目标网页架构(1)进入HTTP://beijing.8684.cn网页,即进入北京公交查询页面(2)单击“以数字开头”中的各数字,观察URL的变化,可发现网页URL变化规律为HTTP://beijing.8684.cn/list+数字。(3)单击数字“1”,进入HTTP:///list1页面,在右键单击页面弹出的快捷菜单中,选择“检查”命令,进入检查页面。(4)使用快捷键“Ctrl+Shift+C”,单击下面的“1路”超链接,以网页源码查询方式显示网页内容。(5)单击a标签中的href属性,进入详细信息页面此时仔细观察URL的变化,将会发现详细信息页面的URL变化规律为HTTP://

beijing.8684.cn/+(a标签中的href属性)。因此,在构建URL时,需要获取对应a标签的href属性的内容。现在,可以开始构建爬虫程序了。在PyCharm中新建一个PythonFile,将其命名为beijingbus,导入需要的urllib请求库,代码如下。言示网66网站原创,侵权必究任务实施2.编写代码(1)构造一个URL,以便获取所有一级页面的URL。可以使用Print打印结果以验证构造,代码如下。结果如下。言示网66网站原创,侵权必究任务实施2.编写代码(2)创建一个get_page_url方法,并在for循环中调用代码。言示网66网站原创,侵权必究任务实施2.编写代码结果如下。上面使用了urllib中request.urlopen请求方法获得网页的源代码,使用BeautifulSoup解析库解析网页源码,查找到需要的二级网页超链接,并将其拼接起来。先用find()方法查找源码div标签中class为'list'的数据,再在找到的数据中用find_all()方法获得要查找的URL片段,并用urllib.parse中的urljoin()模块拼接URL。可以使用Print打印结果以验证构造结果。(3)在获得了详细页面的URL后,即可开始进行详细页面解析。创建一个在get_page_url中调用的get_page_info方法,使用urllib.request.

urlopen请求网页源码,并声明使用BeautifulSoup解析源码,代码如下。言示网66网站原创,侵权必究任务实施2.编写代码在详细信息页面右键单击所弹出的快捷菜单中,选择“检查”命令,随后使用快捷键“Ctrl+Shift+C”选中要爬取的数据,如图2-8所示。

在要爬取的数据上右键单击,在弹出的快捷菜单中选择“Copy”中的“Copyselector”命令,如图2-9所示。通常情况下,使用“Copy”的“Selector”数据提取为空,此时需要手动修改查找路径,缩短路径查找长度。图2-8选中要爬取的数据图2-9选择“Copyselector”命令言示网66网站原创,侵权必究任务实施2.编写代码在get_page_info方法中,使用BeautifulSoup的select()方法获得需要的公交线路名称、类型、里程等数据,代码如下。言示网66网站原创,侵权必究任务实施2.编写代码运行结果如下所示。使用BeautifulSoup的find()、find_all()方法爬取更多的相关数据,如需要爬取对应每路公交对应的详细站点。所要爬取的数据如图2-10所示。图2-10爬取北京1路公交车路线结果言示网66网站原创,侵权必究任务实施2.编写代码在上述公交详细页面中使用快捷键“Ctrl+Shift+C”选中要爬取的数据,查看对应数据的页面代码,结果如图2-11所示。图2-11对应数据的页面代码展示言示网66网站原创,侵权必究任务实施2.编写代码

在get_page_info方法中,使用BeautifulSoup的select()方法首先定位到class="bus-lzlist"的div元素,然后使用find_all()方法进一步获取其后代元素中的所有a元素,进而使用get_text()方法获取相关站点名称代码如下。为了后面方便数据的存储,我们将获取的数据组织成list,并将其在最后输出中转换为<class'str'>类型的数据,代码如下。运行结果如下所示。言示网66网站原创,侵权必究任务实施2.编写代码(4)至此,已经获取了想要爬取的数据。下面需要将其保存起来(在本书中,演示了两种存储方式:文件存储方式和MySQL关系数据库存储方式)。①文件存储方式首先,导入必要的Python模块,要写入CSV文件,需要导入Python自带的csv模块;其次,定义CSV文件路径和写入模式,可以采用Python内置的open函数(第一个参数是文件存储地址,第二个参数是存储模式,w表示以覆盖的形式写入并且自动创建未存在的存储文件)。在打开文件时,需要指定文件路径和打开模式;再次,创建CSV文件写入器,在设置好文件路径和打开模式之后,需要创建一个CSV文件写入器。文件写入器可以通过csv模块的writer函数创建;最后,写入数据到CSV文件,writer对象有两种写入方法:writerow和writerows。其中,writerow用于写入一行数据,writerows用于写入多行数据,写入完数据后,需要关闭CSV文件。具体代码如下所示。言示网66网站原创,侵权必究任务实施2.编写代码在get_page_info方法中,添加代码如下所示。言示网66网站原创,侵权必究任务实施最后,定义main函数,Python中的main函数充当任何程序的执行点。main函数是启动程序执行的必要入口,因为它只在程序直接运行时执行,而不是在作为模块导入时执行。代码如下。2.编写代码②MySQL关系数据库存储方式首先,在Python中,下载MySQL数据库的驱动pymysql并导入项目,代码如下使用pymysql.connect声明数据库连接(host为数据所在地址,user为数据库用户名,passwd为数据库用户密码,db为所要使用的数据库)。使用cursor对象建立连接,代码如下。言示网66网站原创,侵权必究任务实施2.编写代码创建save_mysql函数,使用其execute方法对数据库进行操作,并使用commit()提交数据库操作,在数据表不存在的情况下首先实现数据表的创建后,再执行数据的插入操作,如果数据表存在就执行数据的插入操作,对于数据表是否存在,可以通过设计的table_exists函数进行判断,代码如下。最后,在get_page_info函数后添加如下语句,即可实现数据的存储。任务二Task2言示网66网站原创,侵权必究使用Selenium抓取淘宝网站信息言示网66网站原创,侵权必究任务描述(1)借助学习论坛、网络视频等网络资源和各种图书资源,学习网络爬虫相关技术,

熟悉爬虫基本库Selenium的使用。(2)使用Selenium基本库获取淘宝网站信息的HTML源代码。(3)使用PyQuery解析库实现淘宝网站信息的获取。

任务目标(1)知道Selenium基本库和PyQuery解析库的使用方法。(2)学会使用Selenium基本库和PyQuery解析库实现淘宝网站信息的爬取。言示网66网站原创,侵权必究知识准备1.XPATHXpath是一种用在XML文档中定位元素的语言,同样也支持HTML元素的解析。HTML的结构就是树形结构,HTML是根节点,所有的其他元素节点都是从根节点发出的。其他的元素都是这棵树上的节点Node,每个节点还可能有属性和文本。而路径就是指某个节点到另一个节点的路线。Xpath结构示意如图2-12所示。图2-12Xpath结构示意言示网66网站原创,侵权必究知识准备2.SeleniumSelenium主要是用来做自动化测试的,支持多种浏览器,在爬虫中主要用来解决JavaScript渲染问题。在模拟浏览器进行网页加载时,当使用requests.get(url)无法正常获取网页内容的时候,就可以尝试使用Selenium来爬取网页信息。使用Selenium前,首先需要获取对应浏览器的驱动:谷歌浏览器驱动(ChromeDriver,查看浏览器版本号,下载对应操作系统版本号最接近的驱动),火狐浏览器驱动(geckodriver,不需要先查看浏览器版本号,直接下载对应自己操作系统最新版的驱动即可)或者Edge浏览器驱动(edgedriver,查看浏览器版本号,下载对应操作系统版本号最接近的驱动)。言示网66网站原创,侵权必究知识准备3.PyQuery虽然XPATH和BeautifulSoup很强大,但语法还是略显不够精练。PyQuery是一个Python的第三方库,具有强大的HTML解析能力,它提供了更加简洁优雅的语法,可以像使用JQuery一样的简洁方便,利用它可以方便解析DOM节点的结构,并通过DOM节点的一些属性快速进行内容提取。言示网66网站原创,侵权必究任务实施(1).打开淘宝网网页面打开淘宝网页面,搜索商品显示搜索结果最多为100页,想获取每一页的内容,只要将页码从1到100顺序遍历即可。直接在页面跳转文本框中输入要跳转的页码并单击“确定”按钮,即可进入相应的页面,如图2-14所示。图2-14淘宝网页面言示网66网站原创,侵权必究任务实施(2).获取商品列表首先,导入相关的Selenium模块,代码如下其次,构建一个webdriver对象,使用的浏览器为Chrome。构建一个WebDriverWait对象,它指定了一个等待的最长时间,这里指定的最长时间为10s,指定一个关键字“HUAWEIMate60”,代码如下。定义一个index_page()方法,用于抓取商品列表页。构造一个抓取的URL:/search?initiative_id=staobaoz_20240904&localImgKey=&page={}&q={}'.format(page*44,quote(KEYWORD))。其中,参数q就是要搜索的关键字,在此将此关键字定义为一个变量。言示网66网站原创,侵权必究任务实施

在搜索获取的“HUAWEIMate60”页面中按“F12”键,进入开发者工具,查看相关节点信息。获取爬取内容的CSS选择器,按快捷键“Ctrl+Shift+C”,单击要爬取的内容,可发现要爬取的内容对应的HTML代码高亮显示,选中代码并右键单击,在弹出的快捷菜单中,选择“Copy”中的“Copyselector”命令,如图2-15所示。图2-15复制选择器(2).获取商品列表言示网66网站原创,侵权必究任务实施定义爬取的url,并获取该页面,注意对中文搜索关键字的支持,在该方法中调用了自定义get_products()方法用来获取商品的相关信息,代码如下。在get_products()方法的实现中,采用pyquery解析HTML网页,查看商品列表的源代码,如图2-16所示。图2-16商品列表源码(2).获取商品列表言示网66网站原创,侵权必究任务实施在get_products()方法中可以采用“pyquery对象('父节点子节点')”的方式定位元素,即data('#mainsrp-itemlist.items.item')用来获取<divclass="items">下的所有商品列表。使用pyquery选择得到的节点不管是单个还是多个,类型都是<class'pyquery.pyquery.PyQuery'>,如果得到的是多个节点的对象,则需要进行遍历来获取单个节点对象,这时要注意不能直接遍历多个节点对象,而是要调用多节点对象的items()方法。因遍历的节点对象中依然包含子元素,因此可以使用find()方法来进一步获取信息,此时定位元素传入的参数是CSS选择器。为了将所采集到的数据保存到MongoDB中,get_products()方法实现中调用了自定义save_to_mongo(product)方法,在代码如下。(2).获取商品列表言示网66网站原创,侵权必究任务实施(2).获取商品列表save_to_mongo(product)方法实现,需要注意,运行代码前需要在本地计算机中安装和启动MongoDB服务,并创建好命名为“taobao”的数据库和命名为“info”的数据集合,代码如下。最后,定义main函数,代码如下。言示网66网站原创,侵权必究任务实施(2).获取商品列表运行程序需要注意两点:(1)该爬虫程序运行时,淘宝会跳转到如图2-17所示的登录验证页面,要求进行登录验证。图2-17验证页面因此,为了避免该验证页面的跳出,需要配置Chrome启动属性类ChromeOptions,该配置类的参数如表2-5所示。言示网66网站原创,侵权必究任务实施(2).获取商品列表(2)运行该程序进行数据采集前,请关闭浏览器,否则如果前面有使用chrome浏览器打开的页面,则该程序运行将会报错,错误信息如下。任务三Task3言示网66网站原创,侵权必究使用Scrapy爬取北京公交信息言示网66网站原创,侵权必究任务描述(1)借助学习论坛、网络视频等网络资源和各种图书资源,学习网络爬虫相关技术,

熟悉Scrapy的使用。(2)使用Scrapy实现北京公交信息的获取。

任务目标(1)学会使用Scrapy爬取北京公交信息。言示网66网站原创,侵权必究知识准备(一).Scrapy操作流程如下1.选择一个网站2.创建一个Scrapy项目3.创建一个spider4.定义Item5.编写spider6.提取Item7.存储爬取的数据8.执行项目言示网66网站原创,侵权必究知识准备(二).应对反爬措施(1)封IP:因为爬虫是通过编写程序来自动化爬取网页信息的,因此在单位时间的请求量较大,且相邻请求时间间隔较为固定,这基本可以判断是爬虫程序,当网站运维人员在对日志进行分析发现同一时间段内某一个或某几个IP访问量特别大,就可以在服务器上对异常IP进行封锁。在Scrapy框架中,可以在settings.py文件中设置下载随机延迟DOWNLOAD_DELAY=random.randint(1,4),还可以在middlewares.py文件中进行IP代理设置,以躲避网站运维人员对IP的封锁。在settings.py文件中设置下载随机延迟,代码如下。下面在middlewares.py文件中,添加自定义类ProxyMiddleware进行IP代理设置,代码如下。言示网66网站原创,侵权必究知识准备(二).应对反爬措施最后在settings.py文件中启用中间件,代码如下。(2)封User-Agent:User-Agent是客户端的身份标识,而爬虫请求头就是默认的一些很明显的爬虫头python-requests,当爬虫程序运行时,服务器可以识别到这些爬虫请求头,根据事先策略会拒绝响应该请求。此时可以在middlewares.py中写一个user_agent列表并设置随机方法进行规避。在middlewares.py中,添加自定义类UserAgentMiddleware,代码如下。言示网66网站原创,侵权必究知识准备(二).应对反爬措施然后在settings.py中启用中间件,代码如下。(3)封Cookie:对于每一个访问网页的行为,服务器都会给一个Cookie,用于辨识身份,当某个Cookie访问超过服务器设定的阈值时,就对其进行封禁,过一段时间后再放开封禁。在setings.py文件中可以设置COOKIES_ENABLED=False,禁用Cookie,已进行规避。在setings.py文件中可以配置Cookie,代码如下。(4)验证码验证:常见的网站登录操作都需要验证码,或在爬取的过程中访问次数过多后,触发反爬机制就会自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站。python可以通过一些第三方库如(pytesseract,PIL)来对验证码进行处理,还可以借助第三方打码平台提供的“打码”服务,如百度AI开放平台,超级鹰等。言示网66网站原创,侵权必究知识准备(二).应对反爬措施(5)AJAX异步传输:访问网页的时候服务器将网页框架返回给客户端,可以在不刷新网页的情况下,与服务器进行交互更新网页数据。这些数据在直接发送请求返回的结果中是没有的。AJAX一般是通过XMLHttpRequest对象接口发送请求的,XMLHttpRequest一般被缩写为XHR。点击网络面板上漏斗形的过滤按钮,过滤出XHR请求。通过查看每个请求的访问路径和预览,找到包含目标数据的请求。(6)JS加密请求参数:这是和验证码一样令人头疼的反爬措施,在请求中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论