python爬取 热门小说

来源:互联网 发布:股票短线王软件 编辑:程序博客网 时间:2024/06/06 00:12

最近在学习python爬虫,写了一个脚本算是初级毕业。废话不多说,先上知识点,再上代码。

类的用法

  1. 定义类时后面要加Object参数
  2. 类里面函数第一个参数要写为self
  3. 定义类里面的全局变量是,可以在init函数里面初始化self.xxname
  4. 在调用同一个工程下不同文件中的类时,需要用from xxx import xxClass 来引用

url请求

urlopen(url).read()之后得到网页文本

soup和lxml

  1. soup.select(”)里面可以是css选择器
  2. soup.select()的结果可以转换为字符串之后用来==构造新的soup对象==
  3. soup的那些函数只有soup对象才能使用,find结果和select结果是不能直接使用的
  4. soup.tag 选择soup中的所有tag
  5. soup.find_all()和soup.find()区别是前者返回所有匹配项,后者返回一个。

文件IO

  1. 换行直接writ(string+’\n’)
  2. 打开文件一定添加三个参数,文件名字,编码,打开模式
  3. 用完及时close

xpath

一般来说用直接拷贝的,然后在拷贝的基础上进行修改。

  1. xpath可以获取节点,获取节点内容,获取属性

    (1)在xpath以节点内容结尾 则获取节点

    (2)xpath以/text()结尾 则获取标签内容列表

    (3)xpath以/@attr结尾 则获取属性列表

  2. 调用xpath的方法 etree.HTML(html),然后xpath(xpathString)
  3. xpath不能以/结尾

python数据

  1. list长度 len(listname)
  2. 创建一个字典 dict={}
  3. 为字典添加元素 dict.update(dic)
  4. 遍历字典 for k in dict:
  5. str函数可以把soup结果转换为字符串
  6. 判断一个字符串是否为空 if p.string is not Node:

代码

Controller.py

from DataOutput import DataOutputfrom HTMLParser import HTMLParserfrom HTMLDownLoader import HTMLDownLoaderclass Controller(object):    def crawl(self,url):        downloader=HTMLDownLoader()        htmlParser=HTMLParser()        dataOutput=DataOutput()        htmlContext=downloader.get(url)        dict=htmlParser.parse(htmlContext)        dataOutput.save(dict)if __name__=='__main__':    controller=Controller()    controller.crawl('http://www.seputu.com')

HTMLDownLoader.py

from urllib import requestclass HTMLDownLoader(object):    def get(self,url):        html=request.urlopen(url).read()        return html    pass

HTMLParser.py

from lxml import etreeclass HTMLParser(object):    def parse(self,html):        h=etree.HTML(html)        mulus=h.xpath(".//div[@class='mulu']/div[@class='box']/ul/li[*]/a[@href]/text()")        hrefs=h.xpath(".//div[@class='mulu']/div[@class='box']/ul/li[*]/a[@href]/@href")        i=0        dict={}        while i<len(mulus):            dit={mulus[i]:hrefs[i]}            dict.update(dit)            i=i+1        for k in dict:            print(k+" "+dict[k])        return dict

DataOutput.py

from urllib import requestfrom bs4 import BeautifulSoupclass DataOutput(object):    def __init__(self):        self.outfile=open("盗墓笔记.txt",'a',encoding='utf-8')    def save(self,dict):        for k in dict:            text=request.urlopen(dict[k]).read()            soup=BeautifulSoup(text,'lxml')            body=soup.select('.content-body')            bodyhtml=body[0]            bodysoup=BeautifulSoup(str(bodyhtml),'lxml',from_encoding='utf-8')            ps=bodysoup.find_all('p')            self.outfile.write(k+'\n')            print("writing %s" % k)            for p in ps:                if p.string is not None:                    self.outfile.write(p.string)                    self.outfile.write('\n')        self.outfile.close()