Python 爬虫—scrapy

scrapy用于从网站中提取所需数据的开源协作框架。以一种快速、简单但可扩展的方式。

该爬虫框架适合于那种静态页面, js 加载的话,如果你无法模拟它的 API 请求,可能就需要使用 selenium 这种使用无头浏览器的方式来完成你的需求了

入门

import scrapyclass BlogSpider(scrapy.Spider):name = 'blogspider'start_urls = ['https://www.zyte.com/blog/']def parse(self, response):for title in response.css('.oxy-post-title'):# 返回对象yield {'title': title.css('::text').get()}for next_page in response.css('a.next'):# 返回一个连接,爬虫框架会继续请求这个连接,得到响应后再回调 parse 方法yield response.follow(next_page, self.parse)

运行

scrapy runspider myspider.py

代码中通过 main 方式运行调试

# _*_ coding: utf-8 _*_
import os, sys, pprint
from scrapy.cmdline import executedef build_base_config():current_dir_path = os.path.dirname(os.path.abspath(__file__))# sys.path.append(current_dir_name)  # 入口文件 与模块查找路径、import 相对路径导入有影响print('\n当前路径 PATH:', current_dir_path)# pprint.pprint(sys.path)filepath, file_name = os.path.split(current_dir_path)spiders_name = file_namespiders_name = "bestbuy_new_ca"return current_dir_path, spiders_namedef run_product_review():"""运行产品评论"""current_dir_path, spiders_name = build_base_config()# 结果输出到本地 json 文件execute(['scrapy', 'crawl', spiders_name + '-products_review',f'-o{current_dir_path}/temp/product-review.json','-LDEBUG',f'-apath={current_dir_path}/temp/review-links.json','-acollect_exist=1'])if __name__ == '__main__':run_product_review()pass

简单说:使用了 scrapy.cmdline 提供的工具,执行的命令和在命令行中的一致,只是这种方式可以在 idea 工具中进行 debug 调试

入门和实际开发的不同之处:

  1. 开发上:
    a.入门:例子相对简单,工程结构也不怎么注重
    b.生产:相对复杂,在核心开发上差不多,也是如何去解析 html 结构,工程结构上为了调度和复用,可能会更复杂一点
  2. 调度平台:
    a.有使用一些开源的调度平台,因为是通用
    b.还有的可能会再开源的调度平台上,再包装一层自己的调度平台,仅用来展示(符合产品经理的设计)

官方对于动态内容的引导

https://docs.scrapy.org/en/latest/topics/dynamic-content.html

个人感觉这里提供的知识点还是非常具有参考价值的,简单总结:

  • 使用 scrapy shell 工具定位数据源
$ scrapy shell "quotes.toscrape.com/scroll"
(...)
>>> view(response)
  • 使用 scrapy fetch 工具获取响应到文件,这类似与查看网页源代码
scrapy fetch --nolog https://example.com > response.html
  • 复制请求:在浏览器中可以将请求复制为 curl 格式,然后可以使用 form_curl() 来使用
from scrapy import Requestrequest = Request.from_curl("curl 'https://quotes.toscrape.com/api/quotes?page=1' -H 'User-Agent: Mozil""la/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0' -H 'Acce""pt: */*' -H 'Accept-Language: ca,en-US;q=0.7,en;q=0.3' --compressed -H 'X""-Requested-With: XMLHttpRequest' -H 'Proxy-Authorization: Basic QFRLLTAzM""zEwZTAxLTk5MWUtNDFiNC1iZWRmLTJjNGI4M2ZiNDBmNDpAVEstMDMzMTBlMDEtOTkxZS00MW""I0LWJlZGYtMmM0YjgzZmI0MGY0' -H 'Connection: keep-alive' -H 'Referer: http""://quotes.toscrape.com/scroll' -H 'Cache-Control: max-age=0'")
  • 解析 JavaScript 代码:html 中有些网站会出现 <script>中间是大段的 json 数据有可能是变量,也有可能是初始化数据之类的</script>,就可以使用
比如是
var data = {"field": "value"};可以使用如下的方式匹配
pattern = r'\bvar\s+data\s*=\s*(\{.*?\})\s*;\s*\n'
json_data = response.css('script::text').re_first(pattern)
json.loads(json_data)
{'field': 'value'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/67279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实战-05】 flinksql look up join

摘要 look up join 能做什么&#xff1f; 不饶关子直接说答案&#xff0c; look up join 就是 广播。 重要是事情说三遍&#xff0c;广播。flinksql中的look up join 就类似于flinks flink Datastream api中的广播的概念&#xff0c;但是又不完全相同&#xff0c;对于初次访问…

C语言中关于printf()输出的时候的一个出栈入栈问题

先看一段代码&#xff0c;可以自己尝试一下&#xff0c;反正我当时尝试的时候好多搞不懂&#xff0c; 不过现在搞懂了&#xff0c;里面牵扯到了一个入栈和出栈的问题&#xff0c; 官方解释是这个&#xff1a; 因为C语言函数参数入栈顺序是从右到左的&#xff0c;所以计算顺序是…

20230904工作心得:集合应该如何优雅判空?

1 集合判空 List<String> newlist null;//空指针if( !newlist.isEmpty()){newlist.forEach(System.out::println);}//空指针if(newlist.size()>0 && newlist!null){newlist.forEach(System.out::println);}//可行if(newlist!null && newlist.size()&…

C语言 语法积累

参考博文&#xff1a; c语言中int默认是有符号还是无符号,C语言迷题&#xff1a;有符号数与无符号数的问题_旋斡勃人的博客-CSDN博客前些天偶然看到了一个收集C语言迷题的网站&#xff0c;很是感兴趣。本人对C/C语言本身很是感兴趣&#xff0c;曾经做过几年相应的开发&#xf…

van-cascader 异步加载

vant官网 异步加载选项 在使用级联选择时当一次性拿到数据量太大时不仅接口慢而且前端渲染页面也会变慢&#xff0c;用户体验很不好&#xff0c;建议使用异步加载选项&#xff0c; 拿到的接口让后端返回一个是否还有下一级的判断&#xff0c;不然van-cascader判断没有childre…

【Redis专题】Redis核心数据结构实战与高性能原理解析

目录 前言课程内容一、redis数据类型1.1 字符串&#xff08;string&#xff09;类型&#xff1a;比较简单的一种使用存储模型常用命令&#xff1a;&#xff08;截取自【菜鸟教程】&#xff09;部分演示应用场景 1.2 哈希&#xff08;hash&#xff09;类型&#xff1a;同类数据归…

EasyExcel 修改导出的文件属性

EasyExcel 修改导出的文件属性 导出的文件有多种属性,本文只针对sheet名称进行举例 需要自定义拦截器 ExcelWriter excelWriter EasyExcel.write(fileName).withTemplate(stream).registerWriteHandler(new TemplateSheetStrategyHandler()).build()registerWriteHandler (n…

使用rem + sass + 媒体查询 进行横竖屏适配移动端项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 媒体查询&#xff08;Media Query&#xff09;1.简单了解2.简单例子3. 语法&#xff08;1&#xff09;媒体类型&#xff08;mediatype &#xff09;&#xff0…

快讯 | ALVA 荣获首届“格物杯”联通物联网应用创新大赛复赛一等奖!

8 月 7 日&#xff0c;“物聚龙江 智联百业”物联网创新发展合作交流暨首届“格物杯”联通物联网应用创新大赛企业赛道复赛 (赛区四)在哈尔滨举办。 ALVA Systems 凭借智能远程协助平台—— ALVA Rainbow 在近 50 家企业中脱颖而出&#xff0c;荣获首届“格物杯”联通物联网应…

静态路由配置实验:构建多路由器网络拓扑实现不同业务网段互通

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. 配置 IP 地址2. 按照需求配置静态路由&#xff0c;实现连接 PC 的业务网段互通 摘要&#xff1a; 本实验旨在通过配置网络设备的IP地址和静态路由&#xff0c;实现不同业务网段之间的互通。通过构建一组具有…

华为云 异构数据迁移

数据库和应用迁移 UGO&#xff08;Database and Application Migration UGO&#xff0c;以下简称为UGO&#xff09;是专注于异构数据库结构迁移的专业服务。可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法&#xff0c;通过数据库评估、对象迁移两大核…

如何实现MongoDB数据的快速迁移?

作为一种Schema Free文档数据库&#xff0c;MongoDB因其灵活的数据模型&#xff0c;支撑业务快速迭代研发&#xff0c;广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中&#xff0c;会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整…

《TCP/IP网络编程》阅读笔记--基于TCP的服务器端/客户端

1--TCP/IP协议栈 TCP/IP协议栈共分 4 层&#xff0c;可以理解为数据收发分成了 4 个层次化过程&#xff1b; 链路层&#xff1a; 链路层是物理链接领域标准化的结果&#xff0c;专门定义LAN、WAN、MAN等网络标准&#xff1b; IP层&#xff1a; IP层用于解决数据传输过程中路径的…

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录&#xff0c;可以帮助商家更好地管理会员资金&#xff0c;提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看余额和记录的会员…

LoadImageTask

目录 1 LoadImageTask 1.1 // doInBackground完成后才会被调用 1.1.1 // 调用setTag保存图片以便于自动更新图片 1.2 // 从网上下载图片 1.2.1 // new URL对象 把网址传入 1.2.2 // 把下载好的图片保存到缓存中 LoadImageTaskpackage com.shrimp.xiaoweirob

【vue2第十二章】ref和$refs获取dom元素 和 vue异步更新与$nextTick使用

ref和$refs获取dom元素 为什么会有 ref 和 $refs&#xff1f; 因为在vue页面中使用dom查找元素&#xff0c;不管你是不是在子组件里面查找&#xff0c;查找的都是整个页面的元素&#xff0c;如果你想查找单独组件里面的元素是不容易实现的&#xff0c;除非把每个组件的class写…

Flink---1、概述、快速上手

1、Flink概述 1.1 Flink是什么 Flink的官网主页地址&#xff1a;https://flink.apache.org/ Flink的核心目标是“数据流上有状态的计算”(Stateful Computations over Data Streams)。 具体说明&#xff1a;Apache Flink是一个“框架和分布式处理引擎”&#xff0c;用于对无界…

如何实现响应式布局

要实现响应式布局&#xff0c;您可以采用以下方法&#xff1a; 视口设置&#xff1a; 在HTML的<head>部分中使用meta标签设置视口&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1.0">使用百分比&#xff1a; 使…

故障分析 | OceanBase 频繁更新数据后读性能下降的排查

以下文章来源于爱可生开源社区 &#xff0c;作者张乾 爱可生开源社区. 爱可生开源社区&#xff0c;提供稳定的MySQL企业级开源工具及服务&#xff0c;每年1024开源一款优良组件&#xff0c;并持续运营维护。 测试在做 OceanBase 纯读性能压测的时候&#xff0c;发现对数据做过…

ARM Codec要求

文章目录 前言一、驱动1. linux kernel driver (非V4L2驱动)1.1 porting guide1.2 programing guide1.3 CPU占用率统计1.4 memory使用统计(不包含input/output/working buffer) 2. freeRTOS driver2.1 porting guide&#xff0c;驱动所支持freeRTOS版本列表2.2 programing guid…