爬取今日头条小心(新)得

最近在学习爬取头条,废话不多说直接简单回顾一下,我想爬取每个搜索页面中的图片链接,并且保存起来,但因为整个网页源码是被js渲染过的,所以无法直接从网页中爬取结果页面链接

js的源码如上图所示,爬取的结果不是我们想要的,想要的是axjs请求后被渲染的网页代码。
随便搜索一个关键词后,经过查找发现渲染的文件在xhr的json文件中,如图:
在这里插入图片描述由此可见每个结果页面的链接都在dada:[0:{***,***,article_url:链接},1:{***,***,article_url:链接},***]这个字典结构中,再看一下消息头和参数里的信息:在这里插入图片描述1
由上面可以得到参数,因为是get请求,这些参数就直接附到https://www.toutiao.com/api/search/content/?后面,当在网页上继续往后拖动查询结果,又会有新的xhr的json文件出来,这时我们再看一下参数:在这里插入图片描述可以看到offset参数变成20,再往下托,offset参数就会变成40,keyword就是搜索的关键字,其他固定参数不用操心。所以摸清了规律,我们开始爬,代码我不会具体展示,只是列出大概的功能,:
1.开始爬取搜索结果页面:
在这里插入图片描述先将参数弄到data字典,header请求头感觉还是要加的,不加有时无法访问这个页面

在这里插入图片描述用urllib.parse 下的urlencode将字典转化为url链接附加在https://www.toutiao.com/api/search/content/?后面,防止乱码的化可以加个encoding。
2.当爬取到这个json文件内容后:
在这里插入图片描述因为爬下来都是str字符串格式,所以用data=json.loads(html)将其转化为python中的字典对象来操作,操作字典来获取里面的url肯定更容易。然后判断json文件是否爬取下来了,并且其中是否有data的键名,因为前面分析了,url都在data的键值中。判断键值是否存在,有时虽然有data这个键,但值可能为空。获取到url后用yield生成器迭代。
3.获取到url的列表后,先分析每个页面其中结构,再爬取每个具体结果页面。查找后发现页面中的图片链接在原始的html中,通过上面url链接爬取到的也只能是没有被渲染的原始的html页面:
在这里插入图片描述具体响应体中,:
在这里插入图片描述在这里插入图片描述可以看到其中的链接都藏在js代码中。

但是,我发现结果页面中还有一种组图页面:
在这里插入图片描述刚刚的是普通的页面图片链接,组图链接藏的地方也是原始html,但不太一样:
在这里插入图片描述

爬取这个结果页面:

在这里插入图片描述好了,两种页面图片链接地址都找到,接下来解析提取链接,当然搜索结果中还有除此之外其他页面,我们只爬这两种页面的图片,其他过滤掉

4.解析页面。
在这里插入图片描述用BeautifulSoup下的select获取页面标题(也可以用其他的)。然后最核心的东西来了,正则,普通图片的匹配要简单,不说。组图的正则因为图片链接中参杂了’’,所以匹配‘\’就有点烦。主要就是加r’\’,就能匹配(反正我这样子能匹配),其他部分可以有你自己喜欢配。匹配url出来的放在列表,通过字典返回。
5.
保存数据到mongodb数据库,其中的常量我放在别的配置文件中,最后给出
在这里插入图片描述
在这里插入图片描述6,下载保存图片
在这里插入图片描述其中今日头条图片是相对路径,随你设置。根据图片链接下载图片,保存。response.content是获取内容的二进制数据,因为MD5检验数据后hexdigest()必须是二进制数据。

7.mian()
在这里插入图片描述因为map()中好像不能有None,并且None不能迭代,所以尽量过滤掉。其实也是可以直接 if html的,就懒得改了
8.配置文件,可以直接在其中修改常量
在这里插入图片描述
也是第一次发这种博客,并且是新手,有错误的地方多多理解,希望能帮到有缘人

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值