写个小爬虫,爬取1800篇高考优秀作文

主要目的练习爬虫BeautifulSoup requests 基本用法。同时一些小网页的文字总是注册后才让复制,好麻烦,所以干脆爬取试试。

申明:本文仅限于学习交流,不可以用于商业,爬取的数据请尽快删除

在这里插入图片描述

import requests
from bs4 import BeautifulSoup
import time

#url = 'http://www.ruiwen.com/pingyu/1293492.html'  # 需要请求的网页的链接
#url ='http://www.zuowen.com/yanjianggao/gqx/index_'+'5'+'.shtml' # 需要请求的网页的链接
def jiexi(n): #解析产生第n页的所有文章地址
    url ='http://www.zuowen.com/gaokaozw/manfen/index_'+str(n)+'.shtml' # 按照页码构造需要请求的网页的链接
    html = requests.get(url)  # get方式请求数据
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = 'gbk'
    content = html.text

    # 下面解析你需要的内容
    # 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
    soup = BeautifulSoup(content, "lxml")
    words=soup.find_all('div',class_="artbox_l_c")
    #print(words)
    global result
    global drl
    result = []
    for div in words:
        drl=div.find('a')
        #print(type(drl))
        result.append(drl['href'])
        print(drl['href'])

def gaozi(idd):
    
    url = idd  # 用参数 传入需要请求的文字所在网页的链接
    html = requests.get(url)  # get方式请求数据
    time.sleep(0.5)
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = 'gbk'#解决中文可能会乱码的问题 有时候是utf-8
    if html.status_code==200:
        content = html.text
    else:
        html = requests.get(url)
        time.sleep(2)
        content = html.text
    # 下面解析你需要的内容
    # 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
    soup = BeautifulSoup(content, "lxml")
    words=soup.find_all('p')
    titl=soup.find('h1')
    result2= []
    result2.append(titl.text)
    for th in words[1:-10]:
        result2.append(th.text)
        #print(th.text)
    with open('高考满分作文.txt','a',encoding='gbk') as f:
        f.write('\n'+str(result2[:])+'\n')    
        f.close()
        #print('')


def shouye(): #其实和gaozi(idd)函数一样,但是专门用来爬取第一页,因为第一页网址结构不太一样
    global m            
    m=1
    url ='http://www.zuowen.com/gaokaozw/manfen/index.shtml' # 按照页码构造需要请求的网页的链接
    html = requests.get(url)  # get方式请求数据
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = 'gbk'
    content = html.text

    # 下面,解析你需要的内容
    # 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
    soup = BeautifulSoup(content, "lxml")
    words=soup.find_all('div',class_="artbox_l_c")
    #print(words)
    global result , drl
    result = []
    for div in words:
        drl=div.find('a')
        #print(type(drl))
        result.append(drl['href'])
        print(drl['href'])
    for i in result:
        try:
            
            gaozi(i)
            print('写入第'+str(m)+'篇成功')
            m+=1
        except Exception as e:
            print('第'+str(m)+'篇编码错误')
            m+=1



shouye() #爬取第一页

for n in range(2,92):  #爬取第2页以后所有的页面
    jiexi(n)
    for i in result:
        try:
            
            gaozi(i)
            print('写入第'+str(m)+'篇成功')
            m+=1
        except Exception as e:
            print('第'+str(m)+'篇编码错误')
            m+=1


下面是改进的代码,通用性更强,可以爬取这个网站的各种资源,只需要改变idhead
例如:‘http://www.zuowen.com/yanjianggao/gqx/index_5+.shtml’
只需要取http://www.zuowen.com/yanjianggao/gqx/index_ 即可。后面输入该页面 下面总共可显示的页数,就能完成爬取。
这个页面比较简单,思路特别清晰,下一步可以试试利用Scrapy的框架取爬取提升速度,有兴趣的朋友可以改成这个框架的方法试试。

import requests
from bs4 import BeautifulSoup
import time

#url = 'http://www.ruiwen.com/pingyu/1293492.html'  # 需要请求的网页的链接
#url ='http://www.zuowen.com/yanjianggao/gqx/index_'+'5'+'.shtml' # 需要请求的网页的链接
def jiexi(urlhead,n): #解析产生第n页的所有文章地址
    if n==1:
        url =urlhead[:-1] +'.shtml' # 按照页码构造需要请求的网页第一页的链接
    else:
        url =urlhead+str(n)+'.shtml' # 按照页码构造需要请求的网页的链接
    html = requests.get(url)  # get方式请求数据
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = 'gbk'
    content = html.text

    
    # 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
    soup = BeautifulSoup(content, "lxml")
    words=soup.find_all('div',class_="artbox_l_c")
    #print(words)
    global result
    global drl
    result = []
    for div in words:
        drl=div.find('a')
        #print(type(drl))
        result.append(drl['href'])
        print(drl['href'])

def gaozi(title,idd):#解析每一篇文章链接,获取文字写入txt的函数
    
    url = idd  # 用参数 传入需要请求的文字所在网页的链接
    html = requests.get(url)  # get方式请求数据
    time.sleep(0.5)
    # print(html.status_code)  # 查看请求的状态码(200表示请求正常)
    html.encoding = 'gbk'#解决中文可能会乱码的问题 有时候是utf-8
    if html.status_code==200: #请求页面获取内容
        content = html.text
    else:
        html = requests.get(url) #第一次失败后,再次请求,等待两秒,并且获取页面取内容
        time.sleep(2)
        content = html.text
    
    # 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
    soup = BeautifulSoup(content, "lxml")
    words=soup.find_all('p')
    titl=soup.find('h1')
    result2= []
    result2.append(titl.text)
    for th in words[1:-10]:
        result2.append(th.text)
        #print(th.text)
    with open(title+'.txt','a',encoding='gbk') as f:
        f.write('\n'+str(result2[:])+'\n')    
        f.close()
        #print('')


def writer(peg):#  爬取 jiexi(idhead,n)函数产生的文章地址链接,写入txt文件

    m=1
    for n in range(1,int(peg)):# 手工设置爬取的页数
        jiexi(idhead,n) #解析产生第n页的所有文章地址
        for i in result:
            try:
                
                gaozi(title,i)  #解析每一篇文章链接,获取文字写入txt的函数
                print('写入第'+str(m)+'篇成功')
                m+=1
            except Exception as e:
                print('第'+str(m)+'篇编码错误')
                m+=1


if __name__ == '__main__':
    
    idhead='http://www.zuowen.com/xiaoxue/yinianji/tonghuayuyan/index_'
    title=input('先创建需要保存的文件名:')
    pg=input('输入爬取的页数不要超过总页数:')
    writer(pg)
   

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬码工琪老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值