Python爬虫—糗事百科

作者: loading_miracle | 来源:发表于2017-05-23 21:13 被阅读0次
    糗事百科
    简单谈一谈糗事百科的爬取思路(URL:http://www.qiushibaike.com/text/
    当准备要去爬一个网站前我们应该去思考以下几点:
    • 1.我们要抓取内容的加载方式
    • 2.分页问题
    • 3.选择解析库(通过框架scrapy/requests+Beautifulsoup)

    加载方式

    经过分析糗事百科的网站属于比较正常(不用抓包,或者模拟浏览器之类的)的一个网站(我们经常可以看到爬虫的入门基础教程很多都以这个网站作为示例),在源码中我们可以看到我们想要获取的信息。搞清楚加载方式我们就可以对应着去解析网页,抓取我们想抓的内容了。

    分页问题

    我们通过几张截图来看一下,点击下一页或者切换到某一页之后URL的变化

    初始URL(第一页) 第二页 第五页
    通过以上几张图片可以看出糗事百科的分页是通过page之后的数字控制的,所以我们可以很容易构造出它的分页URL
    urls = [self.url+'page/{}/?s=4985075'.format(i) for i in range(1,36)]
    

    这一块整明白之后,我们就可以去写代码抓取信息了。

    信息抓取

    老大的要求是:

    2.1)糗百 http://www.qiushibaike.com/text/
    包括:作者,性别,年龄,段子内容,好笑数,评论数

    接下来我们看一下这些字段的位置,以及怎样去获取。

    信息内容 循环点

    <em>可以看出,这一部分一直在重复,每一块刚好包含所有信息</em>
    这里说一下我解析这个网页的思路:
    我主要是通过xpath去找我要抓取的字段,找到循环点然后逐个获取,这里有几个问题需要注意一下:

    • 1.匿名用户 对于匿名用户自然就没有性别年龄的区别了,所以我们要特殊处理处理

    • 2.性别 在页面中我们通过符号很容易判别,但是我们在源代码中可看不到性别的区分


    通过这两张图我们可以很清晰的看出他们的的区别在哪里

    示例代码

    里边含有自己写的类,可以参考python简单操作csv文件小例这篇文章

    # -*- coding:utf-8 -*-
    
    import requests
    from lxml import etree
    from Class.store_csv import CSV
    
    class QiuShi(object):
        headers = {
                "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
            }
        url = 'http://www.qiushibaike.com/text/'
        def __init__(self):
            field = ['作者', '性别', '年龄', '段子内容', '好笑', '评论']
            self.write = CSV('qiushi.csv',field)
        #总页码
        def totalUrl(self):
            urls = [self.url+'page/{}/?s=4985075'.format(i) for i in range(1,36)]
            for url in urls:
                print u'正在获取:'+url.split('/')[-2]+u'页'
                self.getInfo(url)
        #抓取详细信息
        def getInfo(self,url):
            item = {}
            html = requests.get(url,headers=self.headers).text
            data = etree.HTML(html)
            infos = data.xpath('//*[@class="article block untagged mb15"]')
            #print infos
            for info in infos:
                try:
                    item[1] = info.xpath('div[1]/a[2]/h2/text()')[0]
                    try:
                        age = info.xpath('div[1]/div[@class="articleGender womenIcon"]/text()')[0]
                        item[2] = u'女'
                        item[3] = age
                    except:
                        age = info.xpath('div[1]/div[@class="articleGender manIcon"]/text()')[0]
                        item[2] = u'男'
                        item[3] = age
                except:
                    item[1] = u'匿名用户'
                    item[2] = u'不详'
                    item[3] = u'不详'
                item[4] = info.xpath('a/div/span/text()')[0].strip()
                item[5] = info.xpath('div[2]/span[1]/i/text()')[0]
                item[6] = data.xpath('//*[@class="qiushi_comments"]/i/text()')[0]
                row = [item[i] for i in range(1,7)]
                self.write.writeRow(row)
    
    if __name__=="__main__":
        qiushi = QiuShi()
        qiushi.totalUrl()
    
    

    结果

    结果

    相关文章

      网友评论

        本文标题:Python爬虫—糗事百科

        本文链接:https://www.haomeiwen.com/subject/xhvgxxtx.html