Python 是比较美的语言,相见恨晚
抓数据的一般步骤
首先,锁定目标,也就是确定网站链接的格式。
其次,在浏览器中或者在wireshark中尝试抓包,分析数据,主要是利用浏览器的查看源码功能,分析需要抓包的数据的结构特点,确定规律。
编写python代码,分析数据,反反复复,得到脚本。
我的例子
#encoding:utf-8
import requests
import re
class Spider:
#构造函数
def __init__(self):
print u('开始执行爬虫')
#用来获取页面源码
def getSource(self,url):
html=requests.get(url)
return html
#产生不同页数
def changePage(self,url,total_page):
now_page=int(re.search('pageNum=(\d+)',url,re.S).group(1))
page_group=[]
for i in range(now_page,total_page+1):
link=re.sub('pageNum=\d+','pageNum=%s'%i,url,re.S)
page_group.append(link)
return page_group
#获取每个课程块的内容,方便以后目标的锁定
def getClass(self,source):
everyClass=re.findall('(<li id=.*?</li>)',source,re.S)
return everyClass
#获取明确的目标
def getInfo(self,eachClass):
info{}
info['title']=re.search('class="lessonimg" title="(.*?)"',eachClass,re.S).group(1)
info['content']=re.search('display: none;">(.*?)</p>',eachClass,re.S).group(1).replace('\n','')
info['srcImg']=re.search('<img src="(.*?)"',eachClass,re.S).group(1)
timeAndLevel=re.findall('<em>(.*?)</em>',eachClass,re.S)
info['classtime'] =timeAndLevel[0].replace('\n', '')
info['classlevel'] = timeAndLevel[1]
info['learnnum'] = re.search('class="learn-number">(.*?)</em>', eachclass, re.S).group(1)
return info
# saveinfo用来保存结果到info.txt文件中
def saveinfo(self, classinfo):
f = open('info.txt', 'a')
for each in classinfo:
f.writelines(("title:" + each['title'] + "\n").encode('utf-8'))
f.writelines(("srcImg:" + each['srcImg'] + "\n").encode('utf-8'))
f.writelines("content:" + (each['content'] + "\n").encode('utf-8').lstrip())
f.writelines(("classtime:" + each['classtime'] + "\n").encode('utf-8'))
f.writelines(("classlevel:" + each['classlevel'] + "\n").encode('utf-8'))
f.writelines(("learnnum:" + each['learnnum'] + "\n\n").encode('utf-8'))
f.close()
if __name__ == '__main__':
classinfo = []
url = 'http://www.jikexueyuan.com/course/?pageNum=1'
jikespider = Spider()
all_links = jikespider.changepage(url, 10)
for link in all_links:
print u'正在处理页面:' + link
html = jikespider.getsource(link)
everyclass = jikespider.geteveryclass(html)
for each in everyclass:
info = jikespider.getinfo(each)
classinfo.append(info)
jikespider.saveinfo(classinfo)
运行的结果:
开始执行爬虫
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=1
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=2
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=3
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=4
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=5
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=6
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=7
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=8
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=9
正在处理页面:http://www.jikexueyuan.com/course/?pageNum=10
Process finished with exit code 0
info.txt文件一个内容:
title:登录到Guitar运行的 Linux系统
srcImg:http://a1.jikexueyuan.com/home/201607/25/07df/57956e9d40cbe.jpg
content:本课程主要介绍除了使用 HDMI 接口以外的系统登陆方式,便于后期在条件受限的情况下进行Guitar 的开发和学习。
classtime:3课时 8分钟
classlevel:初级
learnnum:2515人学习