前言
在之前的一篇文章中,我们第一次尝试了用Python爬虫爬取知乎上面漂亮妹子的照片。但是,由于我们采用的是selenium来爬虫,爬取的数量极其有限。所以,这次换requests来爬虫,终于将爬取量从一百以内突破到一千多张。
为什么有第二弹
在第一弹中我们用了selenium来爬虫,爬取量非常少。我们改用requests来爬虫,成功爬取一千多张图片。就让我们简单比较一下二者的区别:
selenium是什么?
selenium自动化浏览器。就是这样!你如何运用这种力量完全取决于你自己。它主要用于自动化web应用程序以进行测试,但当然不限于此。无聊的基于web的管理任务也可以(也应该)自动化。
一些大型浏览器厂商已经(或正在)采取措施使Selenium成为其浏览器的本地部分,这些厂商支持Selenium。它也是无数其他浏览器自动化工具、api和框架的核心技术。
可以说selenium的本职工作并不是用来爬虫的,而是用于自动化Web应用程序的测试目的。所以用selenium来爬知乎上面的图其实是一种比较剑走偏锋的做法,这也解释为了为什么爬取量不是很乐观。
什么是Requests
来看看 Requests的文档:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
从这个幽默的介绍中,不难看出来Requests作者对于Requests非常有自信,我们用Requests爬知乎图片也刚好验证了这一点。
爬起来!
我们按照惯例简要说明一下爬虫步骤:
01.找到相关的问题,获取问题id
如上图所示,我们需要的id就在红色框线里面。
02.用requests解析网页
get_url = 'https://www.zhihu.com/api/v4/questions/'+id+'/answers?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;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics&limit=5&offset='+str(offset)+'&sort_by=default' header = { 'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0", 'Host': "www.zhihu.com", } r = requests.get(get_url, verify=False, headers=header) content = r.content.decode("utf-8") txt = json.loads(content)
我们把网页信息解析到了txt中。
03.匹配获得图片地址
核心代码:
imgUrls = re.findall(r'data-original="([^"]+)"', str(txt))imgUrls = list(set(imgUrls))for imgUrl in imgUrls:try: splitPath = imgUrl.split('.') fTail = splitPath.pop() print(fTail) if len(fTail) > 3 : fTail = 'jpg' fileName = path +"/" + str(number) + "."+fTail img_data = urllib.request.urlopen(imgUrl).read()
在获取txt后,我们需要用正则表达式匹配图片的地址,然后根据这个地址下载图片到本地。
好了,原理就讲到这里,需要完整代码的同学请在网络搜索我这篇文章。
福利时间
我们选取一些爬到的漂亮妹子照片: