python爬⾍论⽂摘要怎么写_Python爬⾍没有思路?可以看看
这篇⽂章
原标题:Python 爬⾍没有思路?可以看看这篇⽂章
可以说爬⾍是学习 Python 的⼊门必修课。当能独⽴写出第⼀个完整的爬⾍的时候,我们已经迈出了⼀⼤步。因为在这过程中,我们已经学会了如何查看⽂档,学会使⽤ Python 相关库的操作,怎样使⽤ Chrome 的开发者⼯具(相关⼯具)和把抓取的数据保存到数据库中等等⼀系列操作,当然收获最多的还是学习 Python 的⾃信⼼。
下⾯以抓取知乎图⽚为例,迈出我们⾃学 Python 爬⾍的第⼀步。
整体思路
在浏览知乎的时候,经常会看到⼀些有趣的问题,例如有什么万能表情包?,回答中⽹友分享了收藏多年的表情。但是近1500多条回答,⼿动保存表情不现实,所以使⽤爬⾍帮我们完成这项⼯作。
⾸先我们需要做的是收集此类问题。获取问题的 ID(URL 中 question 后的 ID),构建爬⾍任务池。收集问题的⼯作可以交给爬⾍,但是为了抓取的图⽚都符合预期,建议先⼿动收集此类问题。然后将问题
的 ID 存⼊数据库中,爬⾍运⾏时读库获取需要爬取的⽬标贴。通过写⼀个爬⾍,⽣成任务池多线程调⽤。将获取到的答案数据清洗,只收集答案中的图⽚。本案例我们使⽤ mongo 数据库,因为 mongo 数据库简单⽅便,也⽅便我们之后增减字段。
存⼊库中的结构和知乎的类似:答案集合保存所有答案,每⼀个答案是⼀条独⽴的⽂档。
具体类似这种结构:
{
"Answer": [
{
"id": 1,
"question_id": "xxx",
"title": "xxx",
"author": "xxx",
"content: [
"imgUrl",
"..."
]
},
{
"id": 2,
"question_id": "xxx",
"title": "xxx",
"author": "xxx",
"content: [
"imgUrl",
"..."
]
},
...
]
}
其中Answer为数据库的集合,集合中的每⼀项是⼀条回答。⽤这种格式保存的好处是我们只需通过贴⼦的 ID 查询答案即可,保存起来也
⾮常⽅便。
知乎爬⾍
开始之前
在开始之前需要安装项⽬依赖,只⽤到两个常⽤库:
python3 -m pip install requests pymongo
分别⽤来请求 URL 和操作数据库。安装完成后记得启动mongo服务。
Spider
爬⾍代码⽐较简单,关键到知乎答案的接⼝,解析即可。⽽且这个接⼝也是⾮常好的。此处⽤到 Chrome 的开发者⼯具。
接⼝也没有任何加密或权限限制,在请求头中加⼊Cookies就可以了。
通过 Chrome 开发者⼯具分析,请求携带了如下参数,我们只⽤到limit和offset,⽤来控制接⼝返回的数量和返回的位置。
include:
data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,coll
offset:
limit: 3
sort_by: default
platform: desktop
python新手代码大全pdf完整的请求 URL 是:
只要动态更改其中的question,limit和offset就可以了。通过接⼝返回的答案总数,判断需要翻多少页,当然也可以通过接⼝返回的next 和previous来获取下⼀页或前⼀页答案链接。
当然在翻页抓取的时候切记设置睡眠时间,放在服务器上爬的慢⼀点也没关系。我们控制好频率,不要影响到知乎的正常服务。
请求成功后我们就可以根据⾃⼰的需求,存储数据了,⾄于如何判断答案中是否有图⽚,可以参考以下代码。
使⽤到了lxml库,也可以使⽤re库代替。
# 部分代码
@staticmethod
def parse_content(content):
"""解析答案中的 content,直接获取图⽚"""
if "
img_list = set(etree.HTML(content).xpath("//img/@data-original"))
return list(img_list)
else:
return []
先判断回答中是否有img标签,如果没有直接返回空列表,如果有的话,通过data-original属性获取原始⼤⼩的图⽚链接。也是返回⼀个包
含图⽚链接的列表。
在⼊库的时候,我们通过parse_content的返回判断是否需要⼊库,如果是[]就跳过,如果列表不为空就⼊库。这样在之后根据作者展⽰数据的时候不会只显⽰作者信息,却没有回答的情况了(其实是该作者回答中只有问题没有图⽚)。
调⽤爬⾍
当我们完成上述操作,就可以单独写⼀个⽂件使⽤多线程调⽤爬⾍了。
from concurrent.futures import ThreadPoolExecutor
qid_list = db.get_all_question
crawler_list = [ZhihuSpider(qid).run for qid in qid_list]
with ThreadPoolExecutor(max_workers=4) as executor:
future = [executor.submit(task) for task in crawler_list]
for f in future:
qid_list来⾃查库获取所有的知乎贴⼦ ID。使⽤concurrent.futures库并⾏执⾏任务,在我们的代码⾥使⽤ThreadPoolExecutor,它使⽤线程池来异步执⾏调⽤。max_workers控制最多线程的使⽤,本例中使⽤最多4个线程执⾏任务。ThreadPoolExecutor让我们使⽤多线程时更加简单。具体⽂档见 ThreadPoolExecutor。
总结
项⽬的完整代码见 Github:
代码⽐较简单,项⽬只要思路明确,分⽽治之,实现了所有的⼩部分,也就实现了整个项⽬的⼤部分。
最后总结⼀下整体思路:我们先把需要抓取的 ID 存⼊数据库,作为任务池,爬⾍调取任务池中的 ID,将爬取结果再保存到数据库。
等我们学会了 Python 爬⾍,再学 Web 开发的时候,还能将我们抓取的结果展⽰出来,做⼀个表情包⼤全⽹站。⼀不⼩⼼⼜学习了Python Web 开发,多好。
本⽂作者:简讯,⼀名⾃学编程的业余码农
写的不错?赞赏⼀下
长按扫码赞赏我
● 百度近五年最年轻⾼管团队出炉,能否“翻盘”成功?
责任编辑:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。