爬虫学习之小说爬取

数据解析之bs4解析

基础使用

#导包
from bs4 import BeautifulSoup
import lxml
import requests
import re

"""
bs4进行数据解析

"""
if __name__=="__main__":
    #将本地的HTML文件加载到该对象中
    fp=open('./w.html','r',encoding='utf-8')
    soup=BeautifulSoup(fp,'lxml')
    #将互联网上获取的页面源码加载到该对象中
    #page_text=response.text
    #soup=BeautifulSoup(page_text,'lxml')
    # print(soup.a)#soup.tagName 返回的是Html中第一次出现的tagname标签
    #print(soup.div)
    #等价
    #print(soup.find('div'))

    #class_ /id_ 等 属性定位
    # print(soup.find('div',class_='excerpts-wrapper'))

    #find_all 查找a的所有标签, 返回列表
    # ls=soup.find_all('a')
    # for i in ls:
    #     print(i)

    #select 选择器, 可以是id, class, 标签...选择器, 返回列表
    #print(soup.select('header'))
    #层级分隔符> ' '空格表示多个层级,>表示一个层级
    # ls=soup.select('.sitenav>ul>li>a')[0]
    # print(soup.select('.sitenav li>a')[0])
    # print(ls)

    #获取标签中的文本内容
    #text/get_text():可以获取某一个标签下的所有文本内容
    #string:只可以获取该标签下直系的文本内容
    # print(soup.find('div', class_='excerpts-wrapper').text)
    # print(soup.find('div', class_='excerpts-wrapper').string)
    # print(soup.select('.sitenav li>a')[0].string)
    # print(soup.select('.sitenav li>a')[1].get_text())

    #获取href值
    # print(soup.select('.excerpts-wrapper a')[1]['href'])
使用流程:       
    - 导包:from bs4 import BeautifulSoup
    - 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容
        (1)转化本地文件:
             - soup = BeautifulSoup(open('本地文件'), 'lxml')2)转化网络文件:
             - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')3)打印soup对象显示内容为html文件中的内容
基础巩固:
    (1)根据标签名查找
        - soup.a   只能找到第一个符合要求的标签
    (2)获取属性
        - soup.a.attrs  获取a所有的属性和属性值,返回一个字典
        - soup.a.attrs['href']   获取href属性
        - soup.a['href']   也可简写为这种形式
    (3)获取内容
        - soup.a.string
        - soup.a.text
        - soup.a.get_text()
       【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
    (4)find:找到第一个符合要求的标签
        - soup.find('a')  找到第一个符合要求的
        - soup.find('a', title="xxx")
        - soup.find('a', alt="xxx")
        - soup.find('a', class_="xxx")
        - soup.find('a', id="xxx")5)find_all:找到所有符合要求的标签
        - soup.find_all('a')
        - soup.find_all(['a','b']) 找到所有的a和b标签
        - soup.find_all('a', limit=2)  限制前两个
    (6)根据选择器选择指定的内容
               select:soup.select('#feng')
        - 常见的选择器:标签选择器(a)、类选择器(.)id选择器(#)、层级选择器
            - 层级选择器:
                div .dudu #lala .meme .xixi  下面好多级
                div > p > a > .lala          只能是下面一级
        【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

上代码

import re
from bs4 import BeautifulSoup
import lxml
import os
import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36 Edg/89.0.774.77'
}
def fun(url_1):
    if not os.path.exists("./小说"):
        os.mkdir('./小说')
        Path='./小说'
    else:
        Path = './小说'
    url=url_1
    page_text=requests.get(url=url,headers=headers).text
    soup=BeautifulSoup(page_text,'lxml')
    volume_list=soup.select(' .col-4>a')
    Novel_name=soup.select('.book-meta>h1')[0].string
    if not os.path.exists(f'{Path}/{Novel_name}'):
        os.mkdir(f'{Path}/{Novel_name}')
        path=f'{Novel_name}'
    else:
        path = f'{Novel_name}'
    xd_data = ''
    for i in volume_list:
        url=i['href']
        detail_page=requests.get(url=url,headers=headers).text
        title_soup=BeautifulSoup(detail_page,'lxml')
        content_data=title_soup.select('.content>p')
        xd_data+=(i.text+"\n")
        for j in content_data:
            xd_data+=j.text+'\n'
        print(f"{i.text}爬取成功!")
    with open(f'{Path}/{path}/{path}.txt', 'w', encoding='utf-8') as f:
        f.write(xd_data)
    print("已爬取完毕!")

def find():
    url="http://search.zongheng.com/s?"
    data=input("请输入想查找的小说名(模糊查找也可以): ").strip()
    page_data={
        'keyword':data
    }
    search=requests.get(url=url,headers=headers,params=page_data).text
    soup=BeautifulSoup(search,'lxml')
    search_sum=soup.find('div','search-tips')
    search_data=soup.select('.tit>a')
    search_url=soup.select('.btn>a')
    url_sum=[]
    for i in range(0,len(search_url),2):
        url_sum.append(search_url[i]['href'])
    n=0
    for i in search_data:
        print(f"{n}.{i.text}")
        n+=1
    select_n=int(input("请输入编号:").strip())
    Selected_url=url_sum[select_n]
    return Selected_url
def index():
    index_url=find()
    index_page_text=requests.get(url=index_url,headers=headers).text
    index_soup=BeautifulSoup(index_page_text,'lxml')
    index_url_data=index_soup.select('.all-catalog')
    y_n=input('是否开始下载?Y or N:').strip()
    if y_n=='Y':
        fun(index_url_data[0]['href'])
    else:
        exit()
if __name__=="__main__":
    index()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值