关于爬虫知乎话题的逻辑问题

王奇 发布于 2016/05/10 10:43
阅读 159
收藏 0

我觉得我应该是逻辑错误了

我代码的思路是从总话题下,找到一级话题,然后没找到一个一级话题,就从一级话题下callback二级话题的方法,二级话题再callback找子话题id的方法

所以,出现了问题就是只找了一个一级话题,并没有循环查找到所有的一级话题

具体代码为:

def get_level1_topics(self, response):
        # todo: 2016年05月10日00:28:28,找到level1 话题,但是没有迭代下去,需要找到原因,为什么没有循环下去,现在仅仅是一个话题
        urls = response.css('.zm-topic-cat-item > a::attr(href)').extract()
        for u in urls:
            yield scrapy.Request(
                     url=self.zhihu_topics_url + u,
                     headers=headers,
                     meta={
                         "proxy": proxy,
                         "cookiejar": response.meta["cookiejar"],
                     },
                     callback=self.get_level2_topics,
                     dont_filter=True)

    def get_level2_topics(self, response):
        _xsrf = response.css('input[name="_xsrf"]::attr(value)').extract()[0]
        data = response.css('.zh-general-list::attr(data-init)').extract()
        param = json.loads(data[0])
        topic_id = param['params']['topic_id']
        hash_id = param['params']['hash_id']
        # 每次迭代产生20个话题,共选取最多300个话题
        for i in range(15):
            params = json.dumps({"topic_id": topic_id,"offset":i*20,"hash_id":hash_id})
            data = {"method": "next", "params": params, "_xsrf":_xsrf}
            yield scrapy.FormRequest(
                url="https://m.zhihu.com/node/TopicsPlazzaListV2",
                headers=headers,
                formdata=data,
                meta={
                    "proxy": proxy,
                    "cookiejar": response.meta["cookiejar"]
                },
                callback=self.parse_topic_url
            )

    def parse_topic_url(self, response):
        zhihuItem = ZhihuTry2Item()
        myResponse = json.loads(response.body)
        for item in myResponse['msg']:
            fo = codecs.open('tmp.html', "wb", "utf-8")
            fo.writelines(item)
            fo.close()
            soup = BeautifulSoup(open('tmp.html'), 'lxml')
            zhihuItem['topic'] = soup.a.strong.text
            zhihuItem['questionUrl'] = soup.a.attrs['href']
            yield zhihuItem
        time.sleep(1)
请指导一下,谢谢!
加载中
0
batcom
batcom

请先检查 allowed_domains  是否正确填写知乎的域名

然后蜘蛛的调用流程是 __init__,start_requests,parse ,在parse里面写回调就可以一直回调下去,我看你代码里面都没有parse这个函数 parse 里面 回调get_level1_topics 就应该可以一直回调下去

0
数据工厂
数据工厂
你可以看看神箭手云爬虫开发平台shenjianshou.cn,里面云市场里有专门爬取知乎的爬虫。
返回顶部
顶部