简单谈一谈糗事百科的爬取思路(URL:http://www.qiushibaike.com/text/)
当准备要去爬一个网站前我们应该去思考以下几点:
- 1.我们要抓取内容的加载方式
- 2.分页问题
- 3.选择解析库(通过框架scrapy/requests+Beautifulsoup)
加载方式
经过分析糗事百科的网站属于比较正常(不用抓包,或者模拟浏览器之类的)的一个网站(我们经常可以看到爬虫的入门基础教程很多都以这个网站作为示例),在源码中我们可以看到我们想要获取的信息。搞清楚加载方式我们就可以对应着去解析网页,抓取我们想抓的内容了。
分页问题
我们通过几张截图来看一下,点击下一页或者切换到某一页之后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()