Python 爬虫没有思路?可以看看这篇文章

论坛 期权论坛 期权     
脚本之家   2019-7-28 00:30   5602   0
脚本之家

你与百万开发者在一起

[h1]

[/h1]可以说爬虫是学习 Python 的入门必修课。当能独立写出第一个完整的爬虫的时候,我们已经迈出了一大步。因为在这过程中,我们已经学会了如何查看文档,学会使用 Python 相关库的操作,怎样使用 Chrome 的开发者工具(相关工具)和把抓取的数据保存到数据库中等等一系列操作,当然收获最多的还是学习 Python 的自信心。
下面以抓取知乎图片为例,迈出我们自学 Python 爬虫的第一步。
整体思路在浏览知乎的时候,经常会看到一些有趣的问题,例如有什么万能表情包?,回答中网友分享了收藏多年的表情。但是近1500多条回答,手动保存表情不现实,所以使用爬虫帮我们完成这项工作。
首先我们需要做的是收集此类问题。获取问题的 ID(URL 中 question 后的 ID),构建爬虫任务池。收集问题的工作可以交给爬虫,但是为了抓取的图片都符合预期,建议先手动收集此类问题。然后将问题的 ID 存入数据库中,爬虫运行时读库获取需要爬取的目标贴。通过写一个爬虫,生成任务池多线程调用。将获取到的答案数据清洗,只收集答案中的图片。本案例我们使用 mongo 数据库,因为 mongo 数据库简单方便,也方便我们之后增减字段。
存入库中的结构和知乎的类似:答案集合保存所有答案,每一个答案是一条独立的文档。
具体类似这种结构:
    1. {
    复制代码
    1.     "Answer": [
    复制代码
    1.         {
    复制代码
    1.             "id": 1,
    复制代码
    1.             "question_id": "xxx",
    复制代码
    1.             "title": "xxx",
    复制代码
    1.             "author": "xxx",
    复制代码
    1.             "content: [
    复制代码
    1.                 "imgUrl",
    复制代码
    1.                 "..."
    复制代码
    1.             ]
    复制代码
    1.         },
    复制代码
    1.         {
    复制代码
    1.             "id": 2,
    复制代码
    1.             "question_id": "xxx",
    复制代码
    1.             "title": "xxx",
    复制代码
    1.             "author": "xxx",
    复制代码
    1.             "content: [
    复制代码
    1.                 "imgUrl",
    复制代码
    1.                 "..."
    复制代码
    1.             ]
    复制代码
    1.         },
    复制代码
    1.         ...
    复制代码
    1.     ]
    复制代码
    1. }
    复制代码
其中
  1. Answer
复制代码
为数据库的集合,集合中的每一项是一条回答。用这种格式保存的好处是我们只需通过贴子的 ID 查询答案即可,保存起来也非常方便。
知乎爬虫
开始之前
在开始之前需要安装项目依赖,只用到两个常用库:
  1. python3 -m pip install requests pymongo
复制代码
分别用来请求 URL 和操作数据库。安装完成后记得启动
  1. mongo
复制代码
服务。
[h1]Spider[/h1]爬虫代码比较简单,关键找到知乎答案的接口,解析即可。而且这个接口也是非常好找的。此处用到 Chrome 的开发者工具。


接口也没有任何加密或权限限制,在请求头中加入
  1. Cookies
复制代码
就可以了。
通过 Chrome 开发者工具分析,请求携带了如下参数,我们只用到
  1. limit
复制代码
  1. offset
复制代码
,用来控制接口返回的数量和返回的位置。
    1. include: data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_labeled,is_recognized,paid_info;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics
    复制代码
    1. offset:
    复制代码
    1. limit: 3
    复制代码
    1. sort_by: default
    复制代码
    1. platform: desktop
    复制代码
完整的请求 URL 是:
  1. https://www.zhihu.com/api/v4/questions/21115811/answers?include=data%5B*%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%2Cis_recognized%2Cpaid_info%3Bdata%5B*%5D.mark_infos%5B*%5D.url%3Bdata%5B*%5D.author.follower_count%2Cbadge%5B*%5D.topics&offset=&limit=3&sort_by=default&platform=desktop
复制代码
只要动态更改其中的
  1. question
复制代码
  1. limit
复制代码
  1. offset
复制代码
就可以了。通过接口返回的答案总数,判断需要翻多少页,当然也可以通过接口返回的
  1. next
复制代码
  1. previous
复制代码
来获取下一页或前一页答案链接。
当然在翻页抓取的时候切记设置睡眠时间,放在服务器上爬的慢一点也没关系。我们控制好频率,不要影响到知乎的正常服务。
请求成功后我们就可以根据自己的需求,存储数据了,至于如何判断答案中是否有图片,可以参考以下代码。
使用到了
  1. lxml
复制代码
库,也可以使用
  1. re
复制代码
库代替。
    1. # 部分代码
    复制代码
    1. @staticmethod
    复制代码
    1. def parse_content(content):
    复制代码
    1.     """解析答案中的 content,直接获取图片"""
    复制代码
  • [code]    if "
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:100
帖子:20
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP