找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 6553|回复: 12

[求助] 不能完全爬取所有网页

8

主题

22

帖子

22

积分

贫民

积分
22
欢乐的舒畅 发表于 2018-12-3 22:34:03 | 显示全部楼层 |阅读模式
大家好,这是我写的爬取糗事百科的内容,图片以及评论数的爬虫,但是只能爬取到第4页的内容,不能爬取1-3页的内容,求助大家帮我看看问题。
from lxml import etree
import requests
import json

class QiubaiSpider:
    def __init__(self):
        self.url_temp='https://www.qiushibaike.com/8hr/page/{}/'
        self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

    def get_url_list(self): #根据url规律,构造url_list
        url_list=[self.url_temp.format(i) for i in range(1,5)]
        return url_list

    def parse_url(self,url):
        print('Now parsing:',url)
        resp**e=requests.get(url,headers=self.headers)
        return resp**e.content.decode()

    def get_content_list(self,html_str):
        html=etree.HTML(html_str)
        div_list=html.xpath('.//div[@id = "content-left"]/div')
        content_list=[]#content_list等于空列表
    # 分组
        for div in div_list:
           item={}
           item['author_name']=div.xpath('.//h2/text()')[0].strip() if len(div.xpath('.//h2/text()'))>0 else None
           item['content']=div.xpath('.//div[@class="content"]/span/text()')
           item['content'] = [i.strip() for i in  item['content']]
           item['photo']=div.xpath('.//div[@class="thumb"]/a/img/@src')
           item['photo']='https:'+item['photo'][0] if len(item['photo'])>0 else None
           item['stats_vote']=div.xpath('.//span[@class="stats-vote"]/i/text()')[0] if len(div.xpath('.//span[@class="stats-vote"]/i/text()'))>0 else None
           item['stats_comments']=div.xpath('.//span[@class="stats-comments"]/a/i/text()')[0] if len(div.xpath('.//span[@class="stats-comments"]/a/i/text()'))>0 else None
           content_list.append(item)#将item的数据传入content_list中
        return content_list
        print(div_list)

    def save_content_list(self,content_list): #保存
        with open('qiubai_1.txt','a',encoding='utf-8') as f:
            for content in content_list:
                f.write(json.dumps(content,ensure_ascii=False))
                f.write('\n')
        print('保存成功')

    def run(self):#实现主要逻辑
        #1、根据url地址的规律,构造url_list
        url_list=self.get_url_list()
        #2、发送请求获取相应
        for url in url_list:
            html_str=self.parse_url(url)
        #3、提取数据
        content_list=self.get_content_list(html_str)
        #4、保存
        self.save_content_list(content_list)
if __name__ == '__main__':
    qiubai=QiubaiSpider()
    qiubai.run()

回复

使用道具 举报

3

主题

34

帖子

34

积分

贫民

积分
34
彭国禹 发表于 2018-12-4 11:30:29 | 显示全部楼层
麻烦重新编辑吧,你的代码乱了。贴代码应该用代码框。在这个编辑器上面这栏。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

8

积分

贫民

积分
8
smith6036 发表于 2018-12-4 15:15:13 | 显示全部楼层
应该是parse_url的问题,这个函数你只解析了循环的最后一个url
回复 支持 反对

使用道具 举报

8

主题

22

帖子

22

积分

贫民

积分
22
欢乐的舒畅  楼主| 发表于 2018-12-4 15:35:53 | 显示全部楼层
smith6036 发表于 2018-12-4 15:15
应该是parse_url的问题,这个函数你只解析了循环的最后一个url

我在def get_content_list(self,html_str)这里打印html_str,就只显示最后一页内容;但是在#2、发送请求获取相应
        for url in url_list:
            html_str=self.parse_url(url)
这里打印html_str,就能显示全部的内容,不知道问题问题出现那里,还请指教。
回复 支持 反对

使用道具 举报

8

主题

22

帖子

22

积分

贫民

积分
22
欢乐的舒畅  楼主| 发表于 2018-12-4 15:47:41 | 显示全部楼层
彭国禹 发表于 2018-12-4 11:30
麻烦重新编辑吧,你的代码乱了。贴代码应该用代码框。在这个编辑器上面这栏。
...

不好意思,怎么没找到呢
回复 支持 反对

使用道具 举报

0

主题

8

帖子

8

积分

贫民

积分
8
smith6036 发表于 2018-12-4 17:33:37 | 显示全部楼层
欢乐的舒畅 发表于 2018-12-4 15:35
我在def get_content_list(self,html_str)这里打印html_str,就只显示最后一页内容;但是在#2、发送请求获 ...

你的content_list在循环外边,而你的parse_url只是返回循环最后一个url的内容。
回复 支持 反对

使用道具 举报

8

主题

22

帖子

22

积分

贫民

积分
22
欢乐的舒畅  楼主| 发表于 2018-12-4 20:32:59 | 显示全部楼层
smith6036 发表于 2018-12-4 17:33
你的content_list在循环外边,而你的parse_url只是返回循环最后一个url的内容。 ...

那您看应该怎么修改呢,我是菜鸟。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

8

积分

贫民

积分
8
smith6036 发表于 2018-12-7 10:45:52 | 显示全部楼层
欢乐的舒畅 发表于 2018-12-4 20:32
那您看应该怎么修改呢,我是菜鸟。

你把content_list放到循环内就行了。你可以定义一个空list或者dataframe,然后把没个url的内容append到list或者dataframe中就行了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
雪中飞 发表于 2018-12-7 17:40:35 | 显示全部楼层
将提取数据放进for循环内
for url in url_list:
            html_str=self.parse_url(url)
            #3、提取数据
           content_list=self.get_content_list(html_str)
            #4、保存
            self.save_content_list(content_list)


回复 支持 反对

使用道具 举报

8

主题

22

帖子

22

积分

贫民

积分
22
欢乐的舒畅  楼主| 发表于 2018-12-13 22:04:42 | 显示全部楼层
雪中飞 发表于 2018-12-7 17:40
将提取数据放进for循环内
for url in url_list:
            html_str=self.parse_url(url)

您上面写的代码,就是我问题中的代码呀,我重新尝试了一遍,还是不行。可否告诉我正确的代码呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表