python抓取动态网页(爬虫了解爬虫的基本原理及过程Requests+Xpath实现通用爬虫套路 )
优采云 发布时间: 2022-02-22 11:21python抓取动态网页(爬虫了解爬虫的基本原理及过程Requests+Xpath实现通用爬虫套路
)
使用爬虫,我们可以获得大量有价值的数据,从而获得感性知识无法获得的信息,例如:
1.为市场研究和业务分析抓取数据。
抓取知乎优质答案,为你筛选出每个主题下的最佳内容。捕捉房地产网站买卖信息,分析房价变化趋势,做不同区域的房价分析。爬取招聘网站各类职位信息,分析各行业人才需求及薪资水平。
2.作为机器学习和数据挖掘的原创数据。
比如你想做一个推荐系统,那么你可以爬取更多维度的数据,做出更好的模型。
3.爬取优质资源:图片、文字、视频
抓取知乎钓鱼帖图片网站获取福利图片。
原本我们可以手动完成这些事情,但是如果我们只是简单地复制粘贴,那是非常耗时的。比如要获取100万行数据,大约需要两年左右的重复工作。爬虫可以在一天内为你完成,完全不需要任何干预。
对于小白来说,爬虫可能是一件很复杂的事情,技术门槛很高。比如有人认为学习爬虫一定要精通Python,然后系统地学习Python的每一个知识点,但是时间长了发现还是爬不出来;有的人觉得必须先掌握网页的知识,于是就入手了HTML CSS,结果进了前端的坑,累死了……
但是掌握正确的方法,能够在短时间内爬取主流的网站数据,其实是很容易实现的。但建议你从一开始就有一个明确的目标,你要爬取哪些网站的数据,以及多大的量级。
以目标为驱动,您的学习将更加准确和高效。所有你认为必要的必备知识,都可以在完成目标的过程中学习。这是一个流畅的、从零开始的快速入门学习路径。
1.了解爬虫的基本原理和流程
2.Requests+Xpath 实现通用爬虫例程
3.了解非结构化数据的存储
4.学习scrapy并构建一个工程爬虫
5.学习数据库知识,处理*敏*感*词*数据存储和提取
6.掌握各种技巧应对特殊网站防爬措施
7.分布式爬虫,实现*敏*感*词*并发采集,提高效率
1.了解爬虫的基本原理和流程
大多数爬虫遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,实际上模拟了使用浏览器获取网页信息的过程。
简单来说,我们向服务器发送请求后,会得到返回的页面。解析完页面后,我们就可以提取出我们想要的部分信息,存储到指定的文档或数据库中。
这部分可以简单了解HTTP协议和网页的基础知识,如POSTGET、HTML、CSS、JS等,无需系统学习即可简单了解。
2.学习Python包,实现基本爬取流程
Python中有很多爬虫相关的包:urllib、requests、bs4、scrapy、pyspider等,建议从requests+Xpath入手。提取数据。
如果你用过BeautifulSoup,你会发现Xpath省了很多麻烦,层层检查元素代码的工作都省去了。掌握之后你会发现爬虫的基本套路都差不多。一般的静态网站完全没有问题,小猪、豆瓣、尴尬百科、腾讯新闻等基本都能上手。
我们来看一个抓取豆瓣短评的例子:
选择第一个短注释,右键-“勾选”,可以查看源码
复制短评论信息的XPath信息
通过定位,我们得到了第一条短评论的XPath信息:
//*[@id="comments"]/ul/li[1]/div[2]/p
但是通常我们会想要抓取很多简短的评论,然后我们会想要得到很多这样的 XPath 信息:
//*[@id="comments"]/ul/li[1]/div[2]/p//*[@id="comments"]/ul/li[2]/div[2]/p//*[@id="comments"]/ul/li[3]/div[2]/p………………………………
观察1、2、2条短评论的XPath信息,你会发现模式,只有
后面的序号不一样,只对应短评的序号。那么如果我们想爬取这个页面上所有的短评信息,那么没有这个序列号就可以了。
通过 XPath 信息,我们可以用简单的代码进行爬取:
import requestsfrom lxml import etree#我们邀抓取的页面链接url='https://book.douban.com/subject/1084336/comments/'#用requests库的get方法下载网页r=requests.get(url).text#解析网页并且定位短评s=etree.HTML(r)file=s.xpath('//*[@id="comments"]/ul/li/div[2]/p/text()')#打印抓取的信息print(file)
爬取的页面所有短评信息
当然,如果你需要爬取异步加载的网站,你可以学习浏览器抓取来分析真实的请求,或者学习Selenium来实现自动化。这样一来,动态知乎、、TripAdvisor网站基本没问题。
在此过程中,您还需要了解一些 Python 基础知识:
文件读写操作:用于读取参数并保存爬下的内容
list(列表)、dict(字典):用于对爬取的数据进行序列化
条件判断(if/else):解决爬虫中的判断是否执行
循环和迭代(for...while):用于循环遍历爬虫步骤
3.了解非结构化数据的存储
爬取的数据可以以文档的形式存储在本地,也可以存储在数据库中。
刚开始数据量不大的时候,可以直接通过Python语法或者pandas方法将数据保存为文本、csv等文件。或者继续上面的例子:
存储是用 Python 的基础语言实现的:
with open('pinglun.text','w',encoding='utf-8') as f: for i in file: print(i) f.write(i)
以 pandas 语言存储:
#import pandas as pd#df = pd.DataFrame(file)#df.to_excel('pinglun.xlsx')
两段代码都可以存储已经爬下来的短评论信息,将爬取代码后面的代码粘贴进去。
存储此页面的简短评论数据
当然你可能会发现爬回来的数据不干净,可能有缺失、错误等,你还需要对数据进行清洗,可以学习pandas包的基本用法做数据预处理,得到更干净的数据. 具备以下知识点为好:
4.掌握各种技巧应对特殊网站防爬措施
爬取一个页面的数据是没有问题的,但是我们通常要爬取多个页面。
这时候我们需要看看翻页时url是如何变化的,或者以短评的页面为例,我们看看多个页面的url是如何不同的:
https://book.douban.com/subject/1084336/comments/https://book.douban.com/subject/1084336/comments/hot?p=2https://book.douban.com/subject/1084336/comments/hot?p=3https://book.douban.com/subject/1084336/comments/hot?p=4……………………
通过前四页,我们可以找到规律。不同的页面只在末尾标有页面的序列号。我们以爬取5个页面为例,写一个循环更新页面地址即可。
for a in range(5): url="http://book.douban.com/subject/1084336/comments/hot?p={}".format(a)
当然,在爬取过程中也会有一些绝望,比如被网站IP屏蔽,比如各种奇怪的验证码,userAgent访问限制,各种动态加载等等。
遇到这些反爬的方法,当然需要一些高级技巧来应对,比如访问频率控制、代理IP池的使用、抓包、验证码的OCR处理等等。
比如我们经常会发现有些网站的url在翻页后没有变化,这通常是异步加载。我们使用开发者工具分析页面加载信息,经常会得到意想不到的结果。
使用开发人员工具分析加载的信息
比如很多情况下,如果我们通过代码发现网页无法访问,可以尝试添加userAgent信息。
浏览器中的 userAgent 信息
在代码中添加 userAgent 信息
往往网站会在高效开发和反爬虫之间偏爱前者,这也为爬虫提供了空间。掌握了这些反爬技能,大部分网站对你来说都不再难了。
5.学习爬虫框架,搭建工程爬虫
掌握之前技术一般水平的数据和代码基本没有问题,但是在非常复杂的情况下,你可能还是做不到你想要的。这时候,强大的scrapy框架就非常有用了。
scrapy 是一个非常强大的爬虫框架。它不仅可以轻松构建请求,还具有强大的选择器,可以轻松解析响应。不过,最让人惊喜的是它的超高性能,让你可以设计爬虫,模块化。
学习scrapy,可以自己搭建一些爬虫框架,基本具备爬虫工程师的思维。
6.学习数据库基础,处理*敏*感*词*数据存储
当爬回来的数据量较小时,可以以文档的形式存储。一旦数据量很大,这有点行不通。所以,掌握一个数据库是很有必要的,学习目前主流的MongoDB就可以了。
MongoDB可以方便你存储一些非结构化的数据,比如各种评论的文字、图片的链接等。你也可以使用PyMongo在Python中更方便的操作MongoDB。
因为这里用到的数据库知识其实很简单,主要是如何存储和提取数据,需要的时候学。
7.分布式爬虫实现*敏*感*词*并发采集
爬取基础数据不再是问题,你的瓶颈将集中在爬取海量数据的效率上。这个时候,相信大家自然会接触到一个很厉害的名字:分布式爬虫。
分布式的东西听起来很吓人,但其实它是利用多线程的原理,让多个爬虫同时工作。你需要掌握Scrapy + MongoDB + Redis这三个工具。
之前我们说过,Scrapy用于基本的页面爬取,MongoDB用于存储爬取的数据,Redis用于存储待爬取网页的队列,即任务队列。
所以不要被看起来很深的东西吓倒。当你能写出分布式爬虫的时候,就可以尝试搭建一些基本的爬虫架构,实现一些更自动化的数据获取。
你看,经过这条学习路径,你已经可以成为一名老司机了,非常顺利。所以一开始尽量不要系统地啃一些东西,找一个实用的项目(可以从豆瓣小猪这种简单的东西入手),直接入手。
因为爬虫的技术不需要你系统地精通一门语言,也不需要拥有先进的数据库技术,高效的姿势就是从实际项目中学习这些零散的知识点,并且可以保证每次学习都是最需要的部分。
当然,唯一的困难是,当你一开始没有经验的时候,你在寻找资源和解决问题的方法时总会遇到一些困难,因为我们通常很难在一开始就将具体的问题描述清楚。如果有大神帮忙指点学习路径,答疑解惑,效率会高很多。