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

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

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

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

但是,我发现结果页面中还有一种组图页面:
爬取今日头条小心(新)得_第10张图片刚刚的是普通的页面图片链接,组图链接藏的地方也是原始html,但不太一样:
爬取今日头条小心(新)得_第11张图片

爬取这个结果页面:

爬取今日头条小心(新)得_第12张图片好了,两种页面图片链接地址都找到,接下来解析提取链接,当然搜索结果中还有除此之外其他页面,我们只爬这两种页面的图片,其他过滤掉

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

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

你可能感兴趣的:(python爬虫)