极客学院课程爬虫的问题

别致丶的你 Python 单线程爬虫 最后由 极客学院_吕布 于2017年01月20日回复

  • 1 回答
  • 917 浏览

我把实战--极客学院课程爬虫视频里面的代码全部打了一遍,但是因为录视频的时间比较久,当时的版图和现在的已经不一样了,代码也有对应的不同,而且没那么好选取。我在修改正则表达式的时候,想到的办法是,进行多次先抓大后抓小,但是一直出现TypeError: expected string or buffer 这个错误

尝试过几种方法,把list改成str,str改成list,都不行,还是这个错误

折腾了很久,真的已经黔驴技穷了,求帮助

附上我的完整代码:
#coding:UTF-8

import requests

import re

import sys
reload(sys)
sys.setdefaultencoding("utf-8")


class spider(object):
    def __init__(self):
        print u'开始爬取内容~~~'

    def getsource(self,url):
        html = requests.get(url)
        return html.text

    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 geteveryclass(self,source):
        everyclass = re.findall('(<li id=".*?</li>)',source,re.S)
        return everyclass
#只有这部分方法被我改动了
#其余的照搬视频,除了爬取的内容不正确,别的都运行无误
    def getinfo(self,eachclass):
        info = {}
        everytimeandlevel= re.findall('<dl>(.*?)</dd>',eachclass,re.S)
        everycontent = re.findall('<p style="(.*?)</p>',eachclass,re.S)
        everylearnnum = re.findall('</dl>(.*?)</em>',eachclass,re.S)

        info['title'] = re.search('alt="(.*?)">', eachclass,re.S).group(1)
        info['content'] = re.search('">(.*?)</p>', everycontent,re.S).group(1)
        timeandlevel = re.findall('<em>(.*?)</em>',everytimeandlevel,re.S)
        info['classtime'] = timeandlevel[0]
        info['classlevel'] = timeandlevel[1]
        info['learnnum'] = re.search('">(.*?)</em>',everylearnnum,re.S ).group(1)
        return info



    def saveinfo(self,classinfo):
        f=open('info.txt','a')
        for each in classinfo:
            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('learnnum:' + each['learnnum'] + 'nn')
        f.close()

if __name__ == '__main__':

    classinfo = [] 
    url = 'http://www.jikexueyuan.com/course/?pageNum=1'
    jikespider = spider()
    all_links = jikespider.changepage(url,20)
    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)

希望能知道 为什么这样写不行 要怎么解决 

非常感谢!

  • 极客学院_吕布 2017年01月20日 回答 #1楼
  • python中默认使用单引号表示字符串"'"

    所以当-用字符串符值以后,python会把双引号转换为单引号

  • 0 评论