好些没写点啥了。最近在爬取一些数据的时候,发现Y结构挺复杂的啊,各种tag中套tag,目标内容各种被tag隔断,甚至有些内容要在load more网络请求后才能出现,简直口怕。所以今天就记录一些颇具代表性的case,以备后用。
新任务获得:详解部分特殊场景下的爬取逻辑
拼接Key值与使用变量值 - %s %()
1 | <div class="contson" id="contsoneae647c5c110"> |
目标是全取诗句内容,通过id属性,但这个值是contson + 一个变量动态构成的,所以需要拼接。同时在使用这个拼接后的变量时,写法如下
1 | content_id = 'contson'+item_id |
结果:
1 | 'content': ['\n单车欲问边,属国过居延。', |
不含有某属性 - not
1 | <div class="sonspic"> |
目标是获取到这块内容中的作者介绍模块内容。其位于第二个 < p > 中, 但讨厌的是其上还有个讨厌的 < p >, 怎么定位呢?找到所有的 < p >取第二个?根据特殊的style属性的值来找到第二个?都不靠谱,可以看到第一个< p >中包含一个< span >,但目标 < P >中是没有的,所以如下取值
1 | item['authorDetail'] = authorReltated.xpath("p[not(span)]/text()").extract() |
结果:
1 | 'authorDetail': ['王维(701年-761年,一说699年—761年),字摩诘,汉族,河东蒲州(今山西运城)人,祖籍山西祁县,唐朝诗人,有“诗佛”之称。苏轼评价其:“味摩诘之诗,诗中有画;。王维精通佛学,受禅宗影响很大。佛教有一部《维摩诘经》,是王维名和字的由来。王维诗书画都很有名,非常多才多艺,音乐也很精通。与孟浩然合称“王孟”。'] |
load more - 网络请求
经常网页上需要点击一下load more然后再能显示更多内容么。这个流程肢解开来就是,你在点的时候,发送了一个网络请求,而后根据response内容做动态渲染。所以如下处理
查看网络请求
- 打开浏览器「检查元素」
- 切换到「网络」一栏
- 点击 「load more」 触发网络请求
这里我们可以看到具体的细节了
1 | 摘要 |
模拟发送请求
1 | req_url = 'https://so.gushiwen.org/shiwen2017/ajaxshiwencont.aspx?id=%s&value=yi' |
解读
- 拼接url
- 建立request
- 申明这个request的回调函数为「parse_translation」方法,「dont_filter」设置为True是为了防止因为 「requestUrl」被「allowed_domain」给过滤掉了导致请求失败
- 把之前处理好的数据,塞入「request.meta」中带到callback方法中
- 同上
- 递归callback回传的值作为return值
之后就可以在callback方法里继续解析啦
琐碎信息聚合 -
1 | <p> |
这里我们可以看到目标信息,有的是直接作为 < p > 的内容存在的,有的是被塞到 < span > 中的,比较琐碎,需要聚合
1 | a_raw = response.xpath("//p[not (@style)]") |
结果
1 | ['征蓬出汉塞(sài),归雁(yàn)入胡天。征蓬:随风飘飞的蓬草,此处为诗人自喻。归雁:雁是候鸟,春天北飞,秋天南行,这里是指大雁北飞。胡天:胡人的领空。这里是指唐军占领的北方地方。'] |
尾声
未完待续。。。
This artical is avaliable under WTFPL-V2. Generally, everyone is permitted to copy and do what the fuck you want to.
P.S. Even so said, your kindly declaration that inspired from this site - Chen’s Alchemy would be appreciated
本文链接:http://yoursite.com/2019/03/08/python-Scrapy-parser-addon/