路漫漫其修远矣 - 关于内容解析 与 存储

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/u011521609/article/details/79815227

用scrapy框架后,很多访问问题解决了,css解析也非常方便,于是要将之前关注的一个网站爬下来放到mysql里面,然后用tableau接上,这样就可以长期自动监测了。但过程非常坎坷,一直到现在也没有解决问题,但经过探索,好在发现了问题。

问题描述:爬取一个网站,一个页面却多次返回数据,并且无法写入mysql,但是放到json工具读取后发现没问题。于是不知道什么情况,甚至认为mysql的问题。

经过多次尝试:
1,先存mysql,各种不顺利
2,不行之后存json用sublime打开再用朋友写好的python把sublime打开的unicode转化为中文,后来发现csv出问题
3,又想直接用python转,还是没搞定
4,网上找工具,结果不会玩
5,回来读更多解析xpath 甚至想用re(还没用的时候折腾明白了)

期间发现了,编码、源码、mysql数据库等各个方面的知识,踩各种坑。

现在把结论写下对于analyst目前我做的应该已经可用了,在深入下去会比较麻烦,另外在解析内容方面xpath结合正则几乎可以完成一切,这个需要不断学习。

另外问题的答案:

    def parse(self, response):
        lists = response.xpath('//li')
        for list1 in lists:
            item = DpmallItem()
            item['name'] = list1.xpath('//div[@class="pic"]/a/img/@title').extract()
            item['url'] = list1.xpath('//div[@class="pic"]/a/@href').extract()
            yield item
    def parse(self, response):
        lists = response.xpath('//li')
        for list1 in lists:
            item = DpmallItem()
            item['name'] = list1.xpath('//div[@class="pic"]/a/img/@title').extract()
            item['url'] = list1.xpath('//div[@class="pic"]/a/@href').extract()
        yield item

第一段 yield 和 item对齐,但第二段 yield 和 for 对齐,这就导致了差异,具体差异还取决于解析方式,css 和 xpath 是不一样的,具体大家可以自己尝试,下面是不同的返回结果:

yield不同对齐返回的不同结果

要做的数据产品需要非常干净的数据,本身也不需要那么生产线,但基于兴趣还是研究了一下,发现这么多问题,于是写了另外一篇文章 :
analyst 和 engineer 对技术的不同需求
如果入库,还有各种数据清洗,数据格式设置的问题,确实是工程师的技能了,项目赶时间,就按照目前的解决方案了!

近期:探索性爬取,一个一个加工,保障高质量数据!如果需要就买json服务。
长期:继续学习 xpath+re ; pandas 等等;另外遇到问题发到 https://segmentfault.com/ 感觉这个网站还不错!

之前脑残了,一直在想复杂方式,今天终于解决了输出的编码问题

即在 scrapy setting中直接 设置:FEED_EXPORT_ENCODING = ‘utf-8’ 这样爬出来的csv , json都是中文的了,然后用sublime(其它编辑器也行)打开就是中文了,这样完成了第一步:文件大小不受限制,下一步就要研究代理了!

之前一直就是在受到码的限制同时受制于json-csv免费文件只有1mb的限制,于是想存入mysql、要把json打开然后unicode转csv、或者直接把json转csv。现在至少应用方面解决了。

下一步目标就是 ip代理!这样产品速度会快太多,并且可以定时监测从而产生新的产品!

在下一步还是解析,感觉xpath+re基本都能搞定!这段时间踩坑也没白踩,学习了不少知识!

继续学习,乐在其中

关于内容解析:(今日单独操作pymysql 可以操作,一步一步看可以解决,因此后续爬数据还是要坚持三步:1 看看是不是200状态 2 看看返回的response有没有要解析的元素 3 构建新的功能一步一步稳扎稳打,否则都不知道错哪里!)

推荐看这个视频:web端功能自动化定位元素

1.2 关于dom的解释非常经典:dom 是操作html的基本方式,模型指只要是标记型文档都通用,将文档(html or xml)与标签都封装到了对象当中,并且在这些对象中定义了属性和行为,因此可以指挥对象来做事情。

关于xpath知识体系:1,绝对和相对路径 2,使用类似正则思路的 text() contains() start_with() 3,使用父子临近节点。具体见视频。这个视频确实好,从全新角度帮助小白理解内容解析。用xpath可以说没有什么定位不到的!

1,使用chrome或者firefox测试xpath / css, 因为pyspider测试的只是元素的,不能显示类似的有几个,scrapy 还要进入shell 太麻烦,还不如页面上直接测试,而且copy下来xpath 或者 css 之后改起来更方面。

使用firefox:
插件版:
这是一个插件,会显示更多的信息

console版:使用$x(‘这里写xpath表达式’)
写好表达式检测出来点击的效果

使用chrome: 点击ctrl/command + f 显示出来最下面的一行 写入后显示出符合的个数,点击显示相应的界面情况
这里写图片描述

CSS

ID选择器查找元素 :tag[attribute=’value’]

css id示例

其它类选择示例:span[class=’icon-shopping-cart’]

追加类:.class1.class2.class3–‐> 直到找到唯一的元素
多个class

通配符:
“^” –‐>代表以什么文本开始
“$” –‐> 代表以什么文本结尾
“*” –‐>代表包含什么文本

更多看视频

查找子节点:就是绝对路径相对路径的定位吧,下面引入xpath

xpath:

语法://tag[@attibute=’value’]

有效的

text : //a[text()=’忘记密码 ‘]
直接文本定位

contain: //tag[contains(attribute,‘value’)]

//a[contains(text(),’忘记密码’)]
//input[contains(@class,’ipt’) and contains
(@placeholder,’手机号’)]

两个contains并用

starts-with: //tag[starts-with(attribute,‘value’)]

//input[starts-with(@class,’xa-emailOrPhone’)]
//input[starts-with(@placeholder,’请输入登录’)]

示例

父节点:

这里写图片描述

前平级节点:
这里写图片描述

后平级节点:
这里写图片描述

以上的css最方便,xpath最强大,几乎可以完成搞定,如果再加上re的话,那就没有搞不定的。速度的话:id查找最快,class次之。

一般来说网站的数据越值得爬取,结构越清晰,用到简单的css就够了,但偶尔碰到麻烦的,这些都可以搞定了。

猜你喜欢

转载自blog.csdn.net/u011521609/article/details/79815227
今日推荐