Excel爬虫--------------起点回归

目录

一、导言

二、代码讲解

三、成品展示 

 错误小tips:


一、导言

        1、不知不觉就在暴戾,焦虑和虚无中过了一个无趣无味的一年,今年学了很多,但却又什么也学不好,学不通,毕竟自己今年的状况实在太差。眼高手低的情况让我一次又一次与‘熟练’,‘精通’挂不上一点勾。但愿在2023年转变为状态更好的自己,也愿各位能意志坚定,坐上自己想做的事情。切勿如作者一般,三天打鱼两天晒网.......................

二、代码讲解

        1、今天是2022年的最后一天,决定回到起点,做自己该做的事情,给大家带来爬虫的起步作品---------------------爬取多页小说

         2、工具:python 3.11  EXCEL  requests  openpyxl  pyquery

         3、代码讲解:URL

def send_data(url,headers):
    '模拟客户端向网页发送请求'
    respon=requests.get(url=url,headers=headers).text
    return respon

##数据解析
def data_parser(data):
    p=pq(data)      ##将网页返回的源代码转化为pyquery格式,用pyquery解析器去解析,语法为css
    '这里由于每一本书的结构都保存在class属性为rank_d_list的下面,一页有20本书'
    '所以我们将网页多余源代码去掉了,这里的p('.rank_d_list')就包含了书的各个介绍结构'
    '你可以将这个理解为列表,列表中有20本书,书:指的便是这些网页元素块'
    book=p('.rank_d_list')
    ls=[]   ##先创建好一个列表,用于过后一个大列表,里面会将每一本书的内容整合到一个个小列表中
    'book.items()这个方法不是字典本身的item方法,你可以理解为这是将一整块大元素分割成一个个网页小元素标签'
    for i in book.items():
        '这里的I就是每一本书的结构了,i.find('a').attr('href'):指的是找所有a标签中的href属性'
        book_url=i.find('a').attr('href')##这个是书的所在网页
        book_img=i.find('a img').attr('src')##这个是书的封页,找src的属性值
        book_name=i.find('a img').attr('alt')##这个是书的名字,名字当放在img标签的alt属性里
        writer=i.find('.rank_d_book_intro .rank_d_b_cate').attr('title')##这个是找作者
        book_score=i.find('.rank_d_b_ticket').text()##书的评分类似<div>喜羊羊</div> 找到就是喜羊羊,因为.text的用法就是找的文本文字
        kind=i.find('.rank_d_book_intro .rank_d_b_cate a:nth-child(2)').text()##找他的种类
        content=i.find('.rank_d_book_intro .rank_d_b_info').text()##这是书的第一段内容
        '数据解析之后将数据整合到一个小列表当中,这个小列表存储的就是每本书的基本介绍'
        ls.append(["《"+book_name+"》",writer,kind,book_url,book_img,book_score,content])
        print(["《"+book_name+"》",writer,kind,book_url,book_img,book_score,content])
    return ls

        4、数据的保存---excel

##执行菜单

def start():
    ##保存数据
    '''创建工作铺'''
    wb = openpyxl.Workbook()
    sheet = wb.active##添加工作表(sheet)
    '这里是给工作表起字段名----列名'
    sheet.append(['书名', '作者', '种类', '书页URL', '图片', '评分', '内容'])
    '这句代码段的前面部分千万不能放到循环里面,否则将会覆盖掉上一页的内容'
    '由于网页有10页数据,这里我们需要遍历爬取,字符串的拼接'
    for i in range(1,11):
        url='https://www.zongheng.com/rank/details.html?rt=1&d=1&i=2&p='+str(i)
        'UA和cookies的伪造'
        headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54',
        'Cookie': 'ZHID=11678A3059610F4AA3B65CD2D83F040F; ver=2018; zhffr=cn.bing.com; zh_visitTime=1672482682605; sajssdk_2015_cross_new_user=1; Hm_lvt_c202865d524849216eea846069349eb9=1672482683; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218567bc770e0-055e38e67580a2-7a575473-1327104-18567bc770f4ae%22%2C%22%24device_id%22%3A%2218567bc770e0-055e38e67580a2-7a575473-1327104-18567bc770f4ae%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; Hm_lpvt_c202865d524849216eea846069349eb9=1672482734'
        }
        data=send_data(url=url,headers=headers)
        ls=data_parser(data)
        for i in ls:
            '''将数据添加到工作表中,这里的ls就是刚才大列表的,i也就是一个个小列表,存储数据到
            不同单元格需要放入小列表中存储,这样他才不会挤到同一个单元格中'''
            sheet.append(i)
        wb.save('小说网10页.xlsx')##爬取完成,保存到excel
        print('第'+str(i)+'页爬取完成')

        5、完整代码

import openpyxl
from bs4 import BeautifulSoup
import requests
from pyquery import PyQuery as pq

##发送数据
def send_data(url,headers):
    respon=requests.get(url=url,headers=headers).text
    return respon

##数据解析
def data_parser(data):
    p=pq(data)
    book=p('.rank_d_list')
    ls=[]
    for i in book.items():
        book_url=i.find('a').attr('href')
        book_img=i.find('a img').attr('src')
        book_name=i.find('a img').attr('alt')
        writer=i.find('.rank_d_book_intro .rank_d_b_cate').attr('title')
        book_score=i.find('.rank_d_b_ticket').text()
        kind=i.find('.rank_d_book_intro .rank_d_b_cate a:nth-child(2)').text()
        content=i.find('.rank_d_book_intro .rank_d_b_info').text()
        ls.append(["《"+book_name+"》",writer,kind,book_url,book_img,book_score,content])
        print(["《"+book_name+"》",writer,kind,book_url,book_img,book_score,content])
    return ls



##执行菜单

def start():
    ##保存数据
    '''创建工作铺'''
    wb = openpyxl.Workbook()
    sheet = wb.active
    sheet.append(['书名', '作者', '种类', '书页URL', '图片', '评分', '内容'])
    for i in range(1,11):
        url='https://www.zongheng.com/rank/details.html?rt=1&d=1&i=2&p='+str(i)
        headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54',
        'Cookie': 'ZHID=11678A3059610F4AA3B65CD2D83F040F; ver=2018; zhffr=cn.bing.com; zh_visitTime=1672482682605; sajssdk_2015_cross_new_user=1; Hm_lvt_c202865d524849216eea846069349eb9=1672482683; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218567bc770e0-055e38e67580a2-7a575473-1327104-18567bc770f4ae%22%2C%22%24device_id%22%3A%2218567bc770e0-055e38e67580a2-7a575473-1327104-18567bc770f4ae%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; Hm_lpvt_c202865d524849216eea846069349eb9=1672482734'
        }
        data=send_data(url=url,headers=headers)
        ls=data_parser(data)
        for i in ls:
            sheet.append(i)
        wb.save('小说网10页.xlsx')
        print('第'+str(i)+'页爬取完成')


if __name__ == '__main__':
    start()


三、成品展示 

 错误小tips:

        大家最有可能出错找不到元素的时候可能就是在css语法上,也就是pyquery那里,例如有一个标签为<div class=rank_d_list borderB_c_dsh clearfix></div>,这里如果注意看的话很容易发现是有两个空格的,需要将borderB_c_dsh 和clearfix删除,只留最前面那个

四、爬虫CSS语法;

           

<div id='f1' class='v1'>我的

                <div id='f2' class='v2'>你的

                <img src='http:................'>

                <div id='f2' class='v2'>你的

                </div>

                <span id='f3' class='v3'>他的</span>

        </div>

查找第二个div 的img标签:1、.f1 div img(一个空格代表下一个节点)

                                            2、.f1 .f2 img

css查找同名同属性的最后一个标签----------找这个可以用 :    .f1 div:last-child------这是大的div中的最后一个div标签,第一个的话就是.f1 div:first-child    

第N个可以用.f1 div:nth-child(x)

         以上的方法就是用在定位同一标签下的多个标签中的其中一个,大家可以好好去找资料,好好的巩固这个CSS语法,后期学习会更加重要,基本上的网页解析都可以用上他

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小羊只会print

感谢你的支持!一起奋斗吧!

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

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

打赏作者

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

抵扣说明:

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

余额充值