Python抓小说-2019-09-18

python爬小说
分步练习
之前从网上copy的代码总出错,不能用到我想要使用的网站,所以拆解后分部练习
本次找了一个最简单的抓取对象,网页上有正文,且网页排序非常规则
网址:http://www.shizongzui.cc/santi/319.html
小说:三体(科幻最爱,最近刚买了小说,还没读完,就抓它练练吧)

  • 第一步 抓取网页
    首先要获取我们需要的网页,获取网页内容.
    使用requests库,这个是专门用来获取html,xml内容的库,方便使用.
import requests#导入requests库
url = "http://www.shizongzui.cc/santi/319.html"
def getHtmlText(url):#定义抓取网页的函数
    try:
        r = requests.get(url, timeout = 30)#get函数获取网页内容
        r.raise_for_status() #返回的状态码不是200的时候,引发异常;只要在收到响应的时候调用这个方法,就可以避开状态码200以外的各种意外情况
        r.encoding = 'utf-8'#对内容进行编码
        return r.text
    except:
        return ""
print("函数测试输出:\n",a)  #在cmd端打印获取的文件内容,如果顺利看到内容,表示抓取成功,这一行的print代码就可以删掉了
  • 第二步 保存网页
    得到了需要的内容,我们先把它保存起来
a=str(getHtmlText(url)) #将获取的内容赋值给a

with open('D:\\python\\program\\novel.txt','w',encoding='utf-8') as f:
    f.write(a)
#D盘路径,是你准备存放小说的地址,根据自己的需求修改.
#这一步报错,反馈gbk编码问题,增加了encoding参数后成功
#从a里面把需要的内容提取出来
#完成后运行,可以找到novel文件,看到其中有了我们抓取到的信息
  • 第三步 获取网页内的正文内容和文章标题
    抓取到的信息是整个网页,需要提取里面的标题和正文.
    方法有两种:
    1正则表达式,从text中抓取需要的内容
    2.使用靓汤beautifulsoup,使用他的参数获取内容.
  • 使用beautifulsoup
    比直接使用正则简单很多,使用前需要lxml库支持,所以需要先pip安装lxml库和Bs4库
from bs4 import BeautifulSoup #导入靓汤,首先python环境要先pip靓汤库
    soup=BeautifulSoup(a,'lxml') 
    #默认用lxml解析,还有其他方式
    # print(soup.title.string)
    name=soup.title.string
    div=soup.find_all('div',class_='bookcontent clearfix')
    divtotext=str(div)
    text=divtotext.replace('

','').replace('
]','').replace('[
  ','')#使用.replace强行去掉了多余的部分

成功抓取到了标题
正文的抓取需要匹配规则,使用find_all匹配,注意转换格式,保存前需要转为str
抓取成功
遇到了一些问题,正文中表头和换行等字符还保存了下来
使用.replace强行去掉了多余的部分
成功啦
tips,由于运行速度问题,其实可以拆解成两部分,先把需要的内容从互联网拉到本地,然后再对格式进行调整整理.

  • 第四部 抓取多个网页的内容,添加到文件中
    对单个网页已经测试成功了,下一步就是对多个网页做相同的操作,使用
    循环函数,写入时需要注意下,从写入w修改为增加a,不然后面的内容会覆盖前一章.
num=282
while num<=416:
    numtostr=str(num)
       单个网页抓取代码
with open('D:\\python\\program\\novel.txt','a',encoding='utf-8') as f:
        f.write(name+'\n')
        f.writelines(text)
        f.write('\n\n')
    
    num=num+1

使用while函数
因为地址是字符串和数字的组合,所以数字转下格式
while函数后面的内容注意缩进,不然会出错
成功啦 哈哈哈 完美
这个网页上直接有内容的是最方便抓取的,且还有非常标准的序号.

  • 最后贴上完整代码,作为超级新人的第一个代码,还请大神们多多指教.
import requests
num=282
while num<=416:
    numtostr=str(num)
    url = 'http://www.shizongzui.cc/santi/'+numtostr+'.html'
    def getHtmlText(url):
        try:
            r = requests.get(url, timeout = 30)
            r.raise_for_status() 
            r.encoding = 'utf-8'
            return r.text
        except:
            return ""
    a=str(getHtmlText(url)) 
    from bs4 import BeautifulSoup
    soup=BeautifulSoup(a,'lxml') 
    name=soup.title.string
    div=soup.find_all('div',class_='bookcontent clearfix')
    divtotext=str(div)
    text=divtotext.replace('

','').replace('
]','').replace('[
  ','') with open('D:\\python\\program\\novel.txt','a',encoding='utf-8') as f: f.write(name+'\n') f.writelines(text) f.write('\n\n') num=num+1

结束

你可能感兴趣的:(Python抓小说-2019-09-18)