基于Python的图书网爬虫设计与实现
2021-11-28孙泽龙
孙泽龙
(西安职业技术学院,陕西西安,710077)
1 图书网爬虫的特点
由于现在绝大多数图书网站都是基于一定的模板开发的,使用相关的模板,可以快速完成相同版式且不同内容的大量页面,通过这个规律只要把相同的内容都获取下来,求同存异地获取实现大量页面的目的[1]。
Python实现网络爬虫需要手动安装第三方库。Python爬虫需要HTTP请求,它可以理解为是从客户端到服务器端的请求消息。即就是说,无论是真正的一个人在操作浏览器还是一个爬虫,当希望从服务器请求信息或服务时,首先就需要向服务器端发出一个请求,进而服务器会返回相应响应,最后连接关闭,Web服务的流程就是这样完成的。本文用到的库函数包含requests库,使用requests库调用get()和set()两种提交方法获取图书网站源码,如果网址需要提交的内容是JSON格式,要进行调用修改post()方法的一些参数。编码格式用很多种,通过相关图书网站编码的测试,大多数情况下使用”utf-8”可以进行中文正常显示。单网络爬虫是只有一个线程和进程,每次爬取访问一个页面,为了提高爬取效率和充分使用计算机网络带宽,一次同时让爬虫访问多个页面的目的,将使用多进程技术,通过调用multiprocessing多进程库,处理多进程的相关操作。因为爬虫属于读写操作密集型的事情,当我们访问请求网页相关源码时,多线程省去了大量等待返回网页的时间[2]。当然,对于访问数量达到一定数量级时,多线程需要通过异步操作来保持自身爬虫运行的效率。
查看图书网的网页源码后可以看出,它是一种结构化的数据,通过分析网页结构信息,Python的第三方库BeautifulSoup4,可以用来提取HTML和XML页面结构内容,一般需要处理解析源代码从而生成BeautifulSoup对象,找到包含特殊属性的标签,使用find()方法完成查找内容。Python对文本文件操作中,可以导入CSV模块完成对CSV文件的读取,而且CSV文件用Excel应用打开时可读性高[3]。
解析器重要的功能是完成过滤选取网络信息的作用。选取解析器的优劣直接决定了网络爬虫的执行速度和效率。Beautiful Soup不仅支持Python标准库中的HTML解析器外,还支持一些第三方如lxml HTML、lxml XML、html5lib的解析器。Beautiful Soup的解析器对比如表1所示,列出了其目前主要的解析器,以及它们各自的优缺点。
表1 BeautifulSoup解析器对比
2 图书网爬虫应用实例
本文以图书网为案例来说明,爬取目标内容为图书的名称、价格及对应图书预览图的链接,爬取目标网站链接:http://tuan.bookschina.com/。获取图书网页面信息要用到相关的类库,打开网站看到的页面信息是动态加载的。尝试考虑先抓取图书信息的第一页开始,我使用的是chrome浏览器,并设置开发模式,可以查看相关页面的相应加载信息,我们需要通过查看header信息,完成实现模拟登陆实现的功能。
对爬取图书网目标的定义和描述。在聚焦图书网络爬虫中,首先我们要依据爬取图书网需求定义,并聚焦图书网络爬虫的爬取目标,以及进行对应相关的描述。获取初始的URL。根据初始的URL爬取页面,并获得新的URL。从新的URL中过滤掉与爬取目标无关的链接。因为聚焦网络爬虫对网页的爬取是有目的性的,所以与目标无关的网页将会被过滤掉。同时,也需要将已爬取的URL地址存放到一个URL列表中,用于去重和判断爬取的进程。将过滤后的链接放到URL队列中。从URL队列中,根据搜索算法,确定URL的优先级,并确定下一步要爬取的URL地址。网络爬虫的实现原理以及相应的工作原理如图1所示。
图1 图书网爬虫运行原理
在通用网络爬虫中,下一步爬取哪些URL地址,是不太重要的,但是在聚焦网络爬虫中,由于其具有目的性,故而下一步爬取哪些URL地址相对来说是比较重要的。对于聚焦网络爬虫来说,不同的爬取顺序,可能导致爬虫的执行效率不同,所以,我们需要依据搜索策略来确定下一步需要爬取哪些URL地址。从下一步要爬取的URL地址中,读取新的URL,然后依据新的URL地址爬取网页,并重复上述爬取过程。满足系统中设置的停止条件时,或无法获取新的URL地址时,停止爬行。
通过分析分析整个图书网的DOM,可以查看所需要的信息都封装在哪些tags的里面,经过遍历搜索后,发现到所需要的信息其实都封装在
- 的子节点li里面,这样我们通过调用BeautifulSoup的库函数解析抓取功能,爬虫使用requests模块发送带header的请求来模仿浏览器登录,通过循环遍历后打印返回对象为数组,get方法完成tab内部的属性值的获取,从而实现拿到li内的我们需要的信息。
可以通过调用requests里get方法,获得到了响应的response,然后通过BS进行解析,在class 名为taoListInner的div标签中,封装了我们需要的ul下的li,查看了beautifulsoup调用select方法拿到对应的标签,然后拿到对应h2标签下的书名[4]。salePrice class下的价格;以及img标签内src的预览图链接。这样就可以得到出我们需要的第一页所显示的书籍的信息了。要想获取页面的更多书籍信息,由于bs的select方法是只能解析静态的Dom的,因此更多的图书数据是通过Ajax或者JS加载的,查看开发者模式的XHR里面的内容后发现,当下拉滚动条并得到最新图书信息的时候,会继续刷新出一个对应的链接,打开并查看Preview里面,封装了我们需要的数据,并且是以Json形式进行保存的,这样便能使我们方便地拿到动态生成的图书数据了。想要拿到我们需要的Json数据,首先需要去获得相应的Request URL。
当每次有新的书籍信息刷新一次的时候,生成的GroupList?...URL中的Page=?跟随着也会不断递增,因此需要去通过遍历URL并拿到返回的JSON进行解析,这样就可以得到我们想要的所有数据了,当遇到许多动态加载的网站,都会把以Json数据封装作为response,爬虫通过调用loads()方法,把返回的json数据转换为python的字典,方便拿数据拿到数据后我们决定把数据存入磁盘,生成cvs的excel文件,写入到相关的文件中,为了让获得的信息做进一步的数据分析。
要实现整个过程中并发访问程序,需要编写并发访问程序实现多线程同步。通过爬虫程序会先去获得网站的url,然后对url内的json数据进行处理,之后写入文件,所以在整个过程中,我们可以分别让多个进程去获得url中response的数据,然后进行分批地处理,写入文件中,在python中,每个进程都有一个互斥锁,可以保证同一时间内只能有一个线程运行,通过找到遍历url的方法,然后把方法体进一步地封装到scraping_page_data()方法里,并创建线程池。
进行调用join方法后,子进程会在主进程结束后不再继续执行。主进程会去等待其他的进程,在进程池中使用apply方法去实现每个子进程,要执行apply(method_name, (parameters....))的方法。由于我们想要确保每次获得一条url,当前进程写入的数据的时候,不被其他进程打扰,使用给写入操作加上进程锁后,在写的过程中可以知道,如果按照创建一条进程的方法也创建进程锁,会报错,原因是用了进程池,而进程池中的进程并不是由当前同一个父进程创建的原因[5]。multiprocessing.Manager()返回的manager对象控制了一个server进程,可用于多进程之间的安全通信。
3 图书网数据分析应用
Python拥有很强大的关于科学计算库,如Numpy库在数值计算领域中可以用来存储和处理大型矩阵,矩阵运算、矢量处理、精密运算等数值编程。SymPy库用于数学符号的计算库,如数学中常用的自然数E、圆周率pi、虚数i等进行数学公式的符号演算推导及证明。Matplotlib库可以把基于科学的数据可视化展示,生成如曲线、直方图、2D、3D等根据需要的各种图形,它是Python面向对象著名的绘图库,提供了许多方便调用的API命令。
Python扩充程序库中Matplotlib库可以完成2D绘图库,这使得通过编程可以形象直观完成图形图表的绘制,使用Matplotlib类库对于数据图形化处理生成柱状图,通过执行写入操作获得数据后,需要读取cvs中的price,分析价格低于100元的图书的价位分布,可以引入matplotlib包来生成统计图如图2所示。
图2 图书价位统计图
4 结语
伴随着互联网技术的不断发展,大量的公共信息更容易获得,使用爬虫技术将作为获取这些信息的载体工具。面对第四次工业革命的发展,人工智能与物联网将引领IT技术走向新的应用,Python网络爬虫作为科技浪潮领域数据应用的技术。大数据时代对数据分析与数据挖掘有着广泛需求,利用Pyhton爬虫使用的第三方库函数就能实现数值分析的应用优势,因此越来越多的程序员和科研人员也开始使用Pyhton爬虫技术完成辅助数据分析工作,日常生活中人们使用智能手机和各种智能设备每天都会产生海量的数据,相信不远的未来,随着物联网的普及,大量的智能终端设备产生的数据一定会成几何级数的增长,因为面临数据采集的规模将是空前的。今后很好的处理这些数据,可以为各种公司筛选需要发送定制服务的精准客户。高职院校软件相关专业也涉及相关课程内容,帮助学生探索培养人工智能时代的编程思维。
本文是基于python爬虫技术实现图书网相关数据爬取,图书价格可视化的应用。使用第三方库实现图书页面信息获取,并利用统计分析方法库函数,进行了提取图书信息价格的柱状图绘制,这个数据的可视化展示利用分析过程的展示,今后教学实践将继续以Python网络爬虫为载体,“新工科”建设为指导,设计和挖掘更多基于Pyhton网络爬虫的应用案例,提升教育教学水平和激发学生学习兴趣。