import requestsimport re              #启动两个必备模块#class=spider(object):      #先设定一个类,类名叫spider,他的父类是object#  def getsource(self,url):      #这个类有个属性叫getsource,它需要一个变量url#      html=requests.get(url)     #用过request.get获得所瞄准页码的源代码#    return(html.text)  def changepage(self,url,total_page):    #这个类有个属性叫changepage#    now_page=int(re.search(pageNum="(\d+)",url,re.S).group(1))    #当前的页数---这里获得的是一个纯数字的,它是从url上获得的,写这个命令的目的是定位头数字,前面加上了int等于把这个结果改编成int形式#    page_group=[]                    for i in range(now_page,total_page+1):      link=re.sub(pageNum="(\d+)",pageNum=i,url,re.S)    #这个语句的目的是把url里的数从now_page换到total_page+1,这样的walk一遍,达到翻页的目的,这里link会生成好几个url#      page_group.append(link)    return(page_group)    #把生成的那些url放到了page_group这个空列表里#  def geteveryclass(self,source):#这个属性叫geteveryclass,作者他是要把一节课所有的相关介绍内容都一把抓下来,然后再细细分掉#    everyclass=re.findall()    return(everyclass)  def getinto(self,everyclass):    info={}#这里生成了一个空的字典映射#    info["title"]=re.search()#通过字典映射的提取功能,来从上面那一把抓里提取出相关的东西,对应的生成物就是属于了info这个列表里的title这个key的value。注意!生成的东西是一个列表#    info["content"]=re.search()    timeandlevel=re.search()#这俩目标有相同的定位符,因为是列表,就一会使用序号单独分开#    info["classtime"]=timeandlevel[0]    info["classlevel"]=timeandlevel[1]    info["classnumber"]=re.search()    return(info)  def saveinto(self,classinto):    f=open("e:/pythonaaa/b/study & test/1919.txt","a")    for each in classinto:      f.writelines("title:"+each"title"+"\n")      f.writelines("content:"+each"content"+"\n")      f.writelines("classtime:"+each"classtime"+"\n")      f.writelines("classlevel:"+each"classlevel"+"\n")      f.writelines("classnumber:"+each"classlevel"+"\n")    f.close()  if __name__="__main__"classinto=[]url="http://www.jikexueyuan.com/course/?pageNum=1"  jikespider=spider()#这次行动的实例化名称叫jikespider,他属于spider这个类#  all_links=jikespider.changepage(url.20)#在翻页的那个属性里,我们要翻到第20页#  for link in all_links:            #把这20个页单独拆开#    print("正在处理画面"+link)    html=jikespider.getsource(link)#获得了每一个页的源代码#    everyclass=jikespider.geteveryclass(html)#获得了这20页的每一个课程的所有介绍#    for each in everyclass:                 #又把这20页里每一个课程单独拆开#      info=jikespider.getinfo(each)          #对应的每一节课的名称、介绍、等级、时长、人数都做成了一个字典,一一对应,生成了这样的一个info字典映射#      classinto.append(info)#classinto这个空列表已经被info的内容装满#  jikespider.saveinfo(classinfo)#行动以classinfo为变量启动了saveinfo这个属性#

==================================分割线===========================================

1)很多网站虽然显示出来很光鲜靓丽,但是源代码很是混乱,黏黏糊糊成一团,看起来非常恶心,但是这样不空格不回车的代码,在“夹逼正则”的时候非常好夹,因为没有那些看不见的/n和/t,看到正则的定位符就可以下手。

2)有些网站源代码写得很清晰,这样反而在“大锤敲缝”的定位上不太好把握,因为定位<html><div><hL<li>这种网页语言标志符是没用的,要定位就定位有特征的字符。

3)这个代码写得很棒,思路也很清晰,就好像控制一个机器人去桌子边拿一杯水,他先给予机器人几个能力,比如:能走路,知道哪里是桌子,识别水杯,能水杯口向上的抓住水杯,返回。先把这几个能力写明白、写清楚。然后启动这个机器人去做这个事情。这个代码的思路值得学习,但是难点就是变量的不断更替上,有一点跟不上,就会绊住。