当前位置: 首页 > 后端技术 > Node.js

爬虫爬取JSONHTML数据

时间:2023-04-03 12:16:49 Node.js

这两周忙于为公司爬取一些数据,更新文章的速度有些下降。预计今天爬完,总结一下经验。其实我们公司以前是专门做爬虫的,所以不需要前端的人干活。后来那个人离职了,可能就没有爬虫的需求了。突然多了一些,前端就有人来做。老大说用py来做,所以前期研究一下。原理爬虫的原理其实很简单,我们==客户端,他们==服务器。客户端发送请求req,服务器返回响应rsp。得到响应后,解析数据,存入数据库,就大功告成了。请求数据req请求一般有两种,拉数据get比较多。偶尔有些接口需要登录,也就是多带cookies或者headers。其实其中一部分工作就是对输入参数进行分析。get参数拼接在url上,post参数放在body中响应数据。rsp返回的数据一般是两种JSON。一般来说,通过抓包或者网络工具。我们找到了服务器的接口,所以我可以直接访问这个接口。这篇文章的第一个重点就在这里:切换到移动端再次查看,往往会有不同的结果。一般来说PC端和M端的进度不一样,可能不是一个项目组,所以实现方式也会不一样。html比较坑的一种方式,因为没有找到JSON接口。无奈只能采取解析HTML的方式。我之前在研究Node的时候用过它,然后才给后台搭个架子。主要功能如下:自动登录,(带headers,cookies)存储到本地,每次请求时带上token启动代理服务。py老大说要用这个东西。咨询了其他朋友,说可以用下面的工具。requests+beautifulSoup其实就是requests发送请求,beautifulSoup解析HTML。比较原始。scrapy是一个爬虫框架。我在这里学习了www.scrapyd.cn。实现比较完整,可以设置请求间隔,随机ua等功能。前端实现我是铁男,怎么可能轻易放弃?作为一个前端er,这些api让我更加友好。XHR是发送请求、打开对方页面的强大工具,自带cookies。无敌好寂寞。其实也可以找到对方发起请求的位置,设置断点,将对方内部代码绑定到全局,这样内部一些逻辑就可以了。它还支持JSON和HTML。用于HTML类型处理的iframe。在同域的情况下,也是无敌的好吗?HTML获取DOM节点?您甚至可以在窗口上获取对象。vueSSR感受到威胁了吗?其他在线服务商提供的接口(真香)。有免费的也有付费的,免费的一般都是有限的。比如抖音热?比如各种音乐播放列表和作品?IP查询和天气查询就搞定了。上面说了,我建议老大限制一下。我选择了刮擦。scrapyscrapy是一个网络爬虫框架,简称爬虫。如果你没听说过,那就:内政不懂就问度娘,外事不懂就问谷歌、百度或谷歌!……(这里的省略号是说scrapy很厉害,基本都能爬上去,包括你最喜欢的仓老师……这里就不翻译了)这个风骚飞棋的介绍你看了吗?没错,我就是在那里学的。scrapy中文网站。接下来介绍一些我认为初学者比较关心的东西。scrapyHTMLscrapy处理器中的响应标识。你得到的rsp有一些方法。一般来说,需要注意的css选择器只有两个。quote.css('span.text::text'中的'span.text::text').extract_first()看起来眼熟吗?没错,就是我们常用的选择器。通过这个api,我们可以把我们想要的数据限制在一个很小的范围内,然后取字符串。什么?你说你不知道css选择器?前端训练-初级阶段(5-8)-CSS选择器(基础、层次、属性、伪类、伪状态)extract()函数提取列表extract_first()表示提取第一个元素。基本等同于extract()[0]::textSelectthetextinit::attr(href)提取属性xpathquote.xpath('span/small/text()').extract_first()文件,我不会,没见过scrapyJSONimportjson用这个类库解析如:json.loads(response.body.decode('utf-8'))scrapy请求方法getimporturllib可以用来encodeyield汉字scrapy.FormRequest(url,method='GET',headers=self.headers,formdata={},callback=self.parse_list,dont_filter=True,meta={'offset':0,})将post数据放入formdata中传递.yieldscrapy.FormRequest(url,method='POST',headers=self.headers,formdata={},callback=self.parse_list,dont_filter=True,meta={'offset':0,})带有回调参数modulemeta={'offset':0,}以下方式接收disstid=response.meta['offset']外部参数传递方式scrapycrawlargsSpider-atag=Love可以使用以下命令在内部接收。defstart_requests(self):url='http://lab.scrapyd.cn/'tag=getattr(self,'tag',None)#获取tag值,这是在爬取scrapymysql大数据时传入的参数它说爬回来的数据要入库。scrapyMysql/scrapyMysql/items.py写对应的存储字段。importscrapyclassScrapymysqlItem(scrapy.Item):#在这里为你的项目定义字段:#name=scrapy.Field()tag=scrapy.Field()#tagfieldcont=scrapy.Field()#quotecontentpassscrapyMysql/scrapyMysql/spiders/inputMysql.py写爬虫处理操作时,storeitem=ScrapymysqlItem()#实例化item类forvinmingyan:#循环获取每句名言:名言内容,作者,标签item['cont']=v.css('.text::text').extract_first()#提取名言tags=v.css('.tags.tag::text').extract()#提取标签item['tag']=','.join(tags)#将数组转为字符串yielditem#将取到的数据提交给pipline进行处理写入MySQL存储插件:MySQLPipeline.pyimportpymysql.cursorsclassMySQLPipeline(object):def__init__(self):#连接数据库self.connect=pymysql.connect(host='127.0.0.1',#数据库地址port=3306,#数据库端口db='scrapyMysql',#数据库名user='root',#数据库用户名passwd='root',#数据库密码charset='utf8',#编码方式use_unicode=True)#passcurs或者执行增删改查self.cursor=self.connect.cursor()defprocess_item(self,item,spider):self.cursor.execute("""insertintomingyan(tag,cont)value(%s,%s)""",#纯python操作mysql知识,不熟悉的请补上(item['tag'],#item中定义的字段和表字段对应toitem['cont'],))#提交sql语句self.connect.commit()returnitem#必须执行返回设置才能启动MySQLPipline组件ITEM_PIPELINES={'scrapyMysql.MySQLPipline.MySQLPipeline':300,}To总结一下,到此为止我们已经完成了基础知识的所有积累看看里面?.综上所述,需要注意切换PC端和M端,寻找可行方案。注意节制(有些容易限制)python编码问题(真烦人)。网上提供的mysql库和我的不匹配,换了个第三方的MySQLdb接口是真香微信公众号