@IT·互联网Python3自学 爬虫实战Python爬虫作业

Python爬虫—糗事百科

2017-05-23  本文已影响0人  loading_miracle
糗事百科
简单谈一谈糗事百科的爬取思路(URL:http://www.qiushibaike.com/text/
当准备要去爬一个网站前我们应该去思考以下几点:

加载方式

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

分页问题

我们通过几张截图来看一下,点击下一页或者切换到某一页之后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去找我要抓取的字段,找到循环点然后逐个获取,这里有几个问题需要注意一下:


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

示例代码

里边含有自己写的类,可以参考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()

结果

结果
上一篇下一篇

猜你喜欢

热点阅读