js 爬虫抓取网页数据(本文接上文分享:pyspider界面pyspider模拟登录渲染爬取AJAX异步加载网页pyspider)
优采云 发布时间: 2022-04-15 13:40js 爬虫抓取网页数据(本文接上文分享:pyspider界面pyspider模拟登录渲染爬取AJAX异步加载网页pyspider)
这篇文章继续上面的内容,继续聊聊python爬虫的相关知识。上一篇是关于各种爬虫库的。本文主要介绍一个好用的框架pyspider,标题如下:
pyspider简介Pyspider接口pyspider脚本模拟登录JS渲染爬取AJAX异步加载网页pyspider简介
Pyspider 是 Binux 制作的爬虫架构的开源实现。主要功能有:
Pyspider使用去重调度、队列抓取、异常处理、监控等功能作为框架,只需要提供抓取脚本,保证灵活性即可。最后,web的编辑调试环境和web任务的监控成为框架。pyspider的设计基础是:一个python脚本驱动的抓环模型爬虫
pyspider 接口
在终端输入pyspider all运行pyspider服务,然后在浏览器中输入localhost:5000就可以看到pyspider的界面,rate用来控制每秒爬取的页面数,burst可以看做是并发控制。
点击create创建项目
点击新建项目,打开脚本编辑界面
我们可以在这里编写和调试脚本。网络可以在测试期间显示网页。网页左侧的按钮是css选择器,html是网页的源代码,followers显示可以爬取的url。具体调试,亲身体验就知道了。
pyspider 脚本
但是当你创建一个新项目时,你会看到这些默认的脚本模板。接下来简单介绍一下pyspider脚本的编写。
from pyspider.libs.base_handler import *class Handler(BaseHandler):
crawl_config = {
}
@every(minutes=24 * 60) def on_start(self):
self.crawl('__START_URL__', callback=self.index_page)
@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('a[href^="http"]').items():
self.crawl(each.attr.href, callback=self.detail_page)
@config(priority=2) def detail_page(self, response): return { "url": response.url, "title": response.doc('title').text(),
}
更多参数用法可以查看官方文档。
index_page 和 detail_page 只是初始脚本中的回调函数。除了on_start,其他函数名可以自定义@every(minutes=24 * 60)来设置执行频率(24*60是一天一次,所以可以每天执行一次) 爬取一次获取数据) @config 模拟登录
有很多网站用户需要登录才能浏览更多内容,所以我们的爬虫需要实现模拟登录的功能,我们可以使用selenium来实现模拟登录。
Selenium 是一个 Web 应用测试的工具,我们也可以通过 selenium 来实现登录功能。以微博为例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://weibo.com/")
username = driver.find_element_by_css_selector("input#loginname")
username.clear()
username.send_keys('your_username')
password = driver.find_element_by_css_selector('span.enter_psw')
password.clear()
password.send_keys('your_password')
输入帐号和密码后,最大的问题来了。验证码都是图片。一般我们需要使用图像识别来识别验证码,但是由于验证码的种类很多(英文、数字、中文或者它们的混合),而且验证码也可能会被旋转、扭曲甚至附着在每个其他,以至于人眼不能很好的识别,所以大部分模型的通用性和准确率都不是很高。因此,最有效的方法是在selenium打开浏览器后手动登录(过程中调用time.sleep()暂停程序)。由于爬虫最重要的不是解决登录问题,这样就节省了很多时间和代码,虽然笨但很有用。
登录后,使用代码获取cookie,并在pyspider全局参数中将cookie_dict传递给cookies。
cookies_dict = {}
cookies = driver.get_cookies()for cookie in cookies:
cookies_dict[cookie['name']] = cookie['value']
JS渲染
普通请求只能爬取静态的HTML页面,但是大部分网站都是混着JS数据加载的,数据是懒加载的。如果要爬取这些内容,可以使用 selenium + PhantomJS 将网页完整渲染,然后再进行网页分析。PhantomJS 是一个非接口、可编写脚本的 WebKit 浏览器引擎。使用方法类似于使用 selenium + Chrome 模拟登录,但由于 PhantomJS 没有接口,内存消耗会少很多。
爬取 AJAX 以异步加载网页
AJAX 是一种用于创建快速和动态网页的技术。AJAX 可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。要爬取AJAX异步加载的网页,我们需要分析网页的请求和返回信息。具体来说,我们需要使用谷歌浏览器的开发者工具(火狐等浏览器也有这个)查看网络的XHR,但是当网页部分更新时,浏览器发出了什么请求,返回了什么通过浏览器。
在我们微博登录的首页,只要将滚动条移到最下方,就会发现刷新了一条新的微博。这是我们打开开发者工具一直往下滚动,然后你会发现,但是你刷出来的时候有新的信息,总是发出新的请求,返回的json中的数据就是刷新微博的html .
仔细观察发现pagebar的变化是有规律的,id减15,对应新刷新的15微博。因此,可以推测pagebar应该是刷新微博的关键。在此之前,我们需要给爬虫添加请求头,否则很可能被服务器识别为机器人,无法成功访问。请求标头也可以在开发者工具中找到。
def on_start(self): for i in range(10):
url = 'https://weibo.com/aj/mblog/fsearch?pagebar=%s'%i
self.crawl(url, callback=self.index_page)
发现微博内容被成功抓取并返回。然后只需处理您需要的信息。