今日头条爬虫记录

首先说明一下爬取思路,调用的是今日头条搜索框,爬取列表页并进入单条详情爬取详情,目的就是实现自定义关键词得到相对应的内容

我们先看网页,正常观察网页发现response里并没有网页内容

所以,我们点击Network下的XHR按钮,看看网页发送了哪些ajax请求

这时发现有两条数据,对比找一下preview里面 data 标签正式我们需要的内容,有关键词有链接有标题等等

多对比几条发现也都对的上,所以,这正是我们要的数据!

找到了数据源就要想办法爬了这里有很多条,其中不乏有我们不需要的假数据,观察发现,真是数据里都含有‘abstract’,所以我们就可以以这个词为判断依据,剔除假的,取到真的,此处上点代码

    def get_articles(self):
        '''获取标题和url'''
        print self.url
        global count
        try:
            response = requests.get(url=self.url)
            res = json.loads(response.text)
            # print response
            # print res
            news = res['data']
            print len(news)
            data_list = []
            for n in news:
                if n.has_key('abstract'):
                    data_list.append(n)
                else:
                    pass
            print data_list
            print len(data_list)
            for data in data_list:
                # print data
                self.title = data['title']
                self.group_id = data['group_id']
                if self.group_id:
                    self.url = "https://www.toutiao.com/a{}/".format(self.group_id)
                else:
                    self.url = data['article_url']
                title_list.append(self.title)
                url_list.append(self.url)
                # break
        except urllib2.URLError, e:
            print e.reason

 

到这一步,我们就得到了自定义关键词的标题和url信息,下面就可以进入单条爬取了

对于详情页,研究发现并不适用bs4提取,所以下面的提取我用的都是正则

按照上图操作找到文本内容,话不多说上代码

    def download_article(self):
        '''获取详情内容、发帖人、时间'''
        for url in url_list:
            response = requests.get(url=url, headers=self.headers)
            try:
                res = response.text
                # 标题
                r = re.compile(r"content:(.*?),")
                result = r.findall(res)[0]
                item = []
                cont = re.compile(u'[\u4E00-\u9FA5]+')
                data = cont.findall(result)
                for i in data:
                    item.append(i)
                content = ''.join(item).encode("utf-8")
                print '内容', content
                # 作者
                s = re.compile(r"name:(.*?),")
                source = s.findall(res)[0]
                print '作者:', source
                # 时间
                t = re.findall('time:(.*)', res)
                time = ''.join(t).encode("utf-8")
                print '时间', time
            except Exception as e:
                pass

此贴终结(手动滑稽)~~~

需要注意的是我的环境是python2 ,原来代码中文总是提不出来,python3却可以,这个编码问题困扰了我好久,自己动手的小伙伴注意编码格式

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值