# 关键字采集 **Repository Path**: juaran/keyword-collection ## Basic Information - **Project Name**: 关键字采集 - **Description**: 搜索引擎关键字采集 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-14 - **Last Updated**: 2021-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 百度关键字采集 ### 1. API 基本:https://www.baidu.com/s?wd=keyword 参数解析: * wd=java 关键字 * pn=20 页数,20一页 * ie=utf-8 编码 * rn=50 显示数量,10-50 * 百度url 参数详解全 https://blog.csdn.net/qq_26816591/article/details/53335987 百度搜索API https://blog.luzy.top/posts/471744165/ [百度搜索结果URL参数分析](http://www.sins7.cn/analysis-of-baidu-search-results-url-parameters/) **好文**: [pyppeteer方式异步爬取网页](https://blog.csdn.net/stationalz/article/details/109052058) [Pyppeteer入门](https://www.cnblogs.com/tjp40922/p/10812341.html) ### 2. 内容解析 关键信息: * 链接标题 * domain 域名 * URL 链接 * Server类型 * ~~收录时间~~ 遇到问题:**链接去重定向** ![image-20210411155948580](https://gitee.com/juaran/typora-image/raw/master/typora/image-20210411155948580.png) 网页实际链接:https://lusongsong.com/blog/post/541.html 百度重定向链接:http://www.baidu.com/link?url=6ezgHBV-iY-afMEbzJUrYzyMmyBGqWX_u3NDfCiHIU8Dgo3nS_nx4Hb9kX_-PDHk6x8bThh5DW0yyyXu6qABvK 解决方式:Greasy Fork浏览器插件 [AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列](https://greasyfork.org/zh-CN/scripts/14178-ac-baidu-%E9%87%8D%E5%AE%9A%E5%90%91%E4%BC%98%E5%8C%96%E7%99%BE%E5%BA%A6%E6%90%9C%E7%8B%97%E8%B0%B7%E6%AD%8C%E5%BF%85%E5%BA%94%E6%90%9C%E7%B4%A2-favicon-%E5%8F%8C%E5%88%97) 但据[如何去除百度搜索重定向?](https://www.zhihu.com/question/22599004)这个问答下回答: > 当前搜索结果页面的链接在后台挨个访问一遍,然后替换链接,这是唯一的方法…… > > 原来我是不相信的,直到自己用chrome://net-internals 查了下。没错,所谓AC-Baidu用的就是答主说的方法。拒绝tracking,只能自己拒绝百度。 那么只能先取到重定向链接,再请求得到真实地址。 问题二:搜索边界判定 rn=50,代表每页显示数量,pn=rn*(page-1)代表当前页数。当访问超过最大page时将回到第一页。最后一页的标志有: 1. 页码为空(数量太少,没有页码) 2. 显示提示:**为了提供最相关的结果,我们省略了一些内容相似的条目** --> 没有下一页按钮 3. 最大显示15(pn=700),且最后两页内容有重复、**限于网页篇幅,部分结果未予显示。**显示最多750条结果 解决: xpath定位:`//*[@id="page"]/div[@class="page-inner"]/strong`是当前页码,加粗显示,strong标签,而其他页码:`//*[@id="page"]/div[@class="page-inner"]/a`是a标签。当strong标签处在所有a标签之后时,可判定为最后一页。或判定最后一个a标签页码比当前页码小1: ``` python tree.xpath('//*[@id="page"]/div[@class="page-inner"]/strong/span[2]/text()')[0] # strong 当前页码 tree.xpath('//*[@id="page"]/div[@class="page-inner"]/a[last()]/span[2]/text()')[0] # a[last()] 最后一个页码 ``` 问题三:重定向时间过长、未响应 有些网站收录后保存的快照未更新,实际上网站已经down了,打不开。 换一种思路获取重定向地址: ![image-20210411214135728](https://gitee.com/juaran/typora-image/raw/master/typora/image-20210411214135728.png) 网页快照旁边有网站域名的截断部分或知名网站名称。对于知名网站做重定向处理,或通过黑名单去掉这些大网站、对于显示出来的直接取得前半部分域名。 问题四:~~由域名查询主机时发生超时错误,ping该域名发现无法ping通:~~ > ping szit.edu.cn > Ping 请求找不到主机 szit.edu.cn。请检查该名称,然后重试。 有些主机已经不在线,无法获取到200响应。 问题五:使用异步请求时,如果进行页数边界判定,下一页是否访问必须取决于上一页的页码状态,这就与异步同时请求多个页面冲突了。 解决办法:改变爬取策略,先爬取第一页,如果第一页的页码显示为(获取当前页和最后一页): * 空,只有一页,结束任务 * [] [] 只有一页 * 没有下一页,则第2到最后一页(最大10)添加任务 * ['1'] ['4'] 最大页数4,最大页数为4 * ~~有下一页,则至少有10页,当做16页来爬取~~ * 超过10页的情况,只取前十页(500条目),舍弃后面内容 * ['1'] ['10'] 至少有10页,最大页数10 ``` python async def get_max_page(self, html): last_page = etree.HTML(html).xpath('//*[@id="page"]/div[@class="page-inner"]/a[last()-1]/span[@class="pc"]/text()') return 1 if len(last_page) == 0 else last_page[0] ``` 问题六:[百度安全验证滑块](https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https://www.baidu.com/s?wd%3Dwdasdasdasd%26rn%3D50%26pn%3D50%26ie%3Dutf-8&logid=10906402879372476406&signature=d5cb349c3c0117adb8562b4ac4f8d10e×tamp=1618367384) 前缀为:https://wappass.baidu.com/static/captcha/tuxing.html?&ak= 然后重定向到搜索链接。