自定义爬取指定数据

接下来我们通过自定义来抓取我们需要的数据,目标为抓取这个页面中,每个详情页内容的标题、标签、描述、图片的url、点击图片所跳转的url。

点击首页中的 project name > reo,跳转到脚本的编辑界面

获取所有详情页面的url

index_page(self, response) 函数为获取到 www.reeoo.com 页面所有信息之后的回调,我们需要在该函数中对 response 进行处理,提取出详情页的url。

通过查看源码,可以发现 class 为 thum 的 div 标签里,所包含的 a 标签的 href 值即为我们需要提取的数据,如下图

代码的实现

  1. def index_page(self, response):

  2. for each in response.doc('div[class="thumb"]').items():

  3. detail_url = each('a').attr.href

  4. print (detail_url)

  5. self.crawl(detail_url, callback=self.detail_page)

response.doc(‘div[class=”thumb”]’).items() 返回的是所有 class 为 thumb 的 div 标签,可以通过循环 for…in 进行遍历。

each(‘a’).attr.href 对于每个 div 标签,获取它的 a 标签的 href 属性。

可以将最终获取到的url打印,并传入 crawl 中进行下一步的抓取。

点击代码区域右上方的 save 按钮保存,并运行起来之后的结果如下图,中间的灰色区域为打印的结果

注意左侧区域下方的几个按钮,可以展示当前所爬取页面的一些信息,web 按钮可以查看当前页面,html 显示当前页面的源码,enable css selector helper 可以通过选中当前页面的元素自动生成对应的 css 选择器方便的插入到脚本代码中,不过并不是总有效,在我们的demo中就是无效的~

抓取详情页中指定的信息

接下来开始抓取详情页中的信息,任意选择一条当前的结果,点击运行,如选择第一个

实现 detail_page 函数,具体的代码实现:

  1. def detail_page(self, response):

  2. header = response.doc('body > article > section > header')

  3. title = header('h1').text()

  4. tags = []

  5. for each in header.items('a'):

  6. tags.append(each.text())

  7. content = response.doc('div[id="post_content"]')

  8. description = content('blockquote > p').text()

  9. website_url = content('a').attr.href

  10. image_url_list = []

  11. for each in content.items('img[data-src]'):

  12. image_url_list.append(each.attr('data-src'))

  13. return {

  14. "title": title,

  15. "tags": tags,

  16. "description": description,

  17. "image_url_list": image_url_list,

  18. "website_url": website_url,

  19. }

response.doc(‘body > article > section > header’) 参数和CSS的选择器类似,获取到 header 标签, .doc 函数返回的是一个 pyquery 对象。

header(‘h1’).text() 通过参数 h1 获取到标签,text() 函数获取到标签中的文本内容,通过查看源码可知道,我们所需的标题数据为 h1 的文本。

标签页包含在 header 中,a 的文本内容即为标签,因为标签有可能不为1,所以通过一个数组去存储遍历的结果 header.items(‘a’),具体html的源码如下图:

response.doc(‘div[id=”post_content”]’) 获取 id 值为 post_content 的 div 标签,并从中取得详情页的描述内容,有的页面这部分内容可能为空。

其余数据分析抓取的思路基本一致。

最终将需要的数据作为一个 dict 对象返回,即为最终的抓取结果

  1. {

  2. "title": title,

  3. "tags": tags,

  4. "description": description,

  5. "image_url_list": image_url_list,

  6. "website_url": website_url,

  7. }

保存之后直接点击左边区域的 run 按钮运行起来,结果如图,中间灰色区域为分析抓取到的结果。

在主页把任务重新跑起来,查看运行结果,可以看到我们需要的数据都抓取下来

将数据保存到本地的数据库

抓取到的数据默认存储到 resultdb 中,虽然很方便通过浏览器进行浏览和下载,但却不太适合进行大规模的数据存储。

所以最好的处理方式还是将数据保存在常用的数据库系统中,本例采用的数据库为 mongodb。

参数的配置

新建一个文件,命名为 config.json,放在 pyspider 文件目录下,以 JSON 格式存储配置信息。文件到时候作为 pyspider 配置命令的参数。

文件具体内容如下:

  1. {

  2. "taskdb": "mongodb+taskdb://127.0.0.1:27017/pyspider_taskdb",

  3. "projectdb": "mongodb+projectdb://127.0.0.1:27017/pyspider_projectdb",

  4. "resultdb": "mongodb+resultdb://127.0.0.1:27017/pyspider_resultdb",

  5. "message_queue": "redis://127.0.0.1:6379/db",

  6. "webui": {

  7. "port": 5001

  8. }

  9. }

指定了数据库的地址,“webui” 指定网页的端口,这时候我们可以改成 5001 试试,不再用默认的 5000。

Ps. 在运行之前,你得保证打开本地的数据库 mongodb 和 redis,具体怎么玩自行google,反正这两个界面跑起来就对了~

通过设置参数的命令重新运行起来:

pyspider --config config.json

数据库存储的实现

通过重载 on_result(self, result): 函数,将结果保存到 mongodb 中,具体代码实现

  1. import pymongo

  2. ...

  3. def on_result(self, result):

  4. if not result:

  5. return

  6. client = pymongo.MongoClient(host='127.0.0.1', port=27017)

  7. db = client['pyspyspider_projectdb']

  8. coll = db['website']

  9. data = {

  10. 'title': result['title'],

  11. 'tags': result['tags'],

  12. 'description': result['description'],

  13. 'website_url': result['website_url'],

  14. 'image_url_list': result['image_url_list']

  15. }

  16. data_id = coll.insert(data)

  17. print (data_id)

on_result(self, result) 在每一步抓取中都会调用,但只在 detail_page 函数调用后参数中的 result 才会不为 None,所以需要在开始的地方加上判断。

db = client[‘pyspyspider_projectdb’] 中数据库的名字 pyspyspider_projectdb 为之前在 config.json 配置文件中的值。

coll = db[‘website’] 在数据库中创建了一张名为 website 的表。

data_id = coll.insert(data) 将数据以我们制定的模式存储到 mongodb 中。

(除了重载on_result方法外,也可以通过重载ResultWorker类来实行结果的处理,需要在配置文件中加上对应的参数。)

重新新建一个任务,将完整的代码拷进去,在主界面完成的跑一遍。

运行过程中可以看到 mongodb 中的打印不断有数据插入

运行完成后,浏览器查看结果,因为设置了数据库的存储,不再存储在默认的 resultdb 中,此时浏览器的result界面是没有数据的

通过命令行进入数据库查询数据:

  1. use pyspyspider_projectdb

  2. db.website.find()

可看到存储到的数据

  1. { "_id" : ObjectId("5819e422e8e70103751f0f4c"), "image_url_list" : [ "http://media.reeoo.com/MING Labs.png!main" ], "website_url" : "https://minglabs.com/en", "tags" : [ "design company", "onepage", "showcase" ], "description" : "MING Labs is a UX design and development company with offices in Germany, China and Singapore. We craft digital products for all screens and platforms.", "title" : "MING Labs" }

  2. { "_id" : ObjectId("581ad797e8e7010fa8ea85c1"), "tags" : [ "onepage" ], "title" : "SpaceTravellers", "website_url" : "https://www.totaltankstelle.de/spacetravellers/", "image_url_list" : [ "http://media.reeoo.com/SpaceTravellers.png!main" ], "description" : "Sie haben Treibstoff gesucht und viel mehr gefunden." }

  3. { "_id" : ObjectId("581ad8ede8e70112e51bd4e1"), "website_url" : "http://aftershock.cc/", "title" : "Aftershock", "tags" : [ "onepage" ], "description" : "Evento de design para aqueles que estão tentando viver (ou quase) de arte. Chega mais! Dia 22-23 de outubro. Botafogo-RJ", "image_url_list" : [ "http://media.reeoo.com/Aftershock.png!main" ] }

  4. { "_id" : ObjectId("581ad8ede8e70112e51bd4e3"), "website_url" : "http://www.proudandpunch.com.au/", "title" : "Proud & Punch", "tags" : [ "food", "ice cream", "onepage" ], "description" : "At Proud & Punch, we’re all about real flavours that pack a punch. We start with fresh ingredients and turn them into tasty treats with a whole lot of flair, right here in Australia. We don’t take shortcuts and have nothing to hide. We’re just proudly real, proudly delicious and proudly here to give you the feel-good treat you’ve been waiting for.", "image_url_list" : [ "http://media.reeoo.com/Proud & Punch.png!main" ] }

  5. { "_id" : ObjectId("581ad8ede8e70112e51bd4e5"), "website_url" : "http://www.mobil1.com.sg/theendlessrace-game/", "title" : "The Endless Race", "tags" : [ "game" ], "description" : "", "image_url_list" : [ "http://media.reeoo.com/The Endless Race.png!main" ] }

  6. { "_id" : ObjectId("581ad8eee8e70112e51bd4e7"), "website_url" : "http://www.maztri.com/en/", "title" : "Maztri", "tags" : [ "design agency", "showcase" ], "description" : "Maztri est une agence d’architecture intérieure et de design qui travaille sur la sensorialité des espaces et des objets qui nous entourent.", "image_url_list" : [ "http://media.reeoo.com/Maztri.png!main" ] }

  7. ...

至此,我们便已将所抓取到的结果存储到了本地。

其他

本文所举例子只是最基本的使用方式,更复杂的,如通过参数的配置,让爬虫长期运行与服务器定期对数据进行更新,对根网页进行更深层次的处理,通过集群的方式来运行爬虫等。感兴趣的可自行去研究了。

另,这个框架是国人写的,附上官方文档的地址

完整的源码实现地址在这,直接拷贝粘贴到代码区域就能用,用的是python3。

pyspider自定义爬取指定数据相关推荐

  1. 爬虫 spider09——爬取指定数据,去重复,并存储到mysql

    爬取指定数据,去重复,并存储到mysql. 技术栈:Springboot+ssm+定时(定时器)爬取+redis去重+mybatis保存 一.创建父项目Spider pom.xml <?xml ...

  2. 用python爬取指定数据流量是几点_使用python进行微信宜出行人流量数据爬取

    写在前面 由于宜出行的登录策略更新,导致无法使用qq登录直接爬取人流量的问题,近期进行了代码升级,已经解决了该问题,并且能顺利爬取数据,示例如下.目前暂不提供源代码,如有需要宜出行数据,可联系:917 ...

  3. 网络爬虫-爬取指定城市空气质量检测数据

    爬取指定城市空气质量检测数据 网站链接 → https://www.aqistudy.cn/historydata/ 以月数据为例,见下图: 然后我们通过console调试可以发现 这个网页在item ...

  4. Python爬虫进阶之爬取篮球赛数据

    相信很多人都喜欢打篮球, 并且对自己喜欢的球星的比赛数据都很关注,于是我就想着去爬取篮球网站的数据.但是相对来说爬取一个数据也没啥挑战性,于是我又赶着学习了xlsxwriter模块,将爬取的的数据放入 ...

  5. Python网络爬虫爬取招聘数据(利用python简单零基础)可做可视化

    爬取Boss直聘相关的招聘数据 一.相关需求分析 1.目的 二.直聘网页结构分析 1.网页相关值的查找 2.网页的下一页规律查找 三.Python相关的第三库介绍 1.Urllib的介绍 (1)url ...

  6. MATLAB爬虫爬取股票数据

    近年来,大数据盛行,有关爬虫的教程层次不穷.那么,爬虫到底是什么呢? 什么是爬虫? 百度百科是这样定义的: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...

  7. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  8. python大神-python大神教你在最短时间内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  9. python爬取网页公开数据_如何用Python爬取网页数据

    使用Python爬取网页数据的方法: 一.利用webbrowser.open()打开一个网站:>>> import webbrowser >>> webbrowse ...

最新文章

  1. 一文读懂机器学习中的模型偏差
  2. C++读取txt中数据的两种方法
  3. python绘制散点图的函数_Python用PyQt5绘制多彩随机散点图,基本控件之QPainter使用详解...
  4. 一个非常好用的JS日历控件(支持.NET)
  5. 机器学习(六)——PCA降维处理
  6. 域名排名(前100万)
  7. Rayson API 框架分析系列之5: NIO实现原理
  8. 李嘉诚:没有人愿意贫穷,但出路在哪(转自意林)
  9. 正则表达式内的常用的函数 2
  10. java实用教程第五版电子书,爱了爱了
  11. 有限体积法(5)——对流-扩散方程的离散
  12. 智能采油管理系统介绍
  13. 【机器学习的Tricks】随机权值平均优化器swa
  14. Matlab中 strcmp函数使用
  15. python实现将ip段解析为单个ip
  16. unity android全景视频播放,Unity VR——全景视频播放方案
  17. 【android】音乐播放器之UI设计的点点滴滴
  18. 期货开户云流程和注意事项
  19. 2023 年 1 月阿拉丁指数百强发布:更替率 17%,旅游回暖,餐饮火爆,要“年味儿”更要“健康”
  20. cpu、进程、线程、多线程的一个简单解释(转载)

热门文章

  1. 程序员2009精华本(china-pub首发)
  2. HTML5期末大作业:蛋糕团购商城网站设计——蛋糕团购商城模板 (4页) 蛋糕团购网页设计制作 简单静态HTML网页作品 商城网页作业成品 网购网站模板
  3. 老外对你放狠话都不知道?常见英语口语“狠话”!
  4. JavaWeb开发中,servlet的url-pattern的映射规则
  5. 帝国cms 单页面栏目管理
  6. 今天的虚空龙日常任务
  7. ASP.Net Core 3.1 中使用JWT认证(笔记)
  8. gentoo on macbook pro driver for the Broadcom Facetime HD webcam
  9. 【PBL项目实战】户外智慧农场项目实战系列——3.云端可视化页面开发及设备数据源的配置与调试
  10. Acwing 1474. 多项式 A + B