【XMU学科实践二】豆瓣爬虫实践

news2024/11/20 18:22:25

文章目录

  • 分析豆瓣阅读网站
  • 完整爬虫代码

叠甲:仅供学习。。
XMU的小朋友实在不会了可以参考我的思路,但还是建议自己敲一遍哈。
学科实践二还是挺有意思的!

分析豆瓣阅读网站

豆瓣阅读出版页面


打开浏览器开发者工具,可以看到如下图所示的内容

完整爬虫代码

我23年3月的时候,是把豆瓣全部爬取了()一共5w6k条
在这里插入图片描述

import sys
import numpy as np
sys.path.append('/home/aistudio/external-libraries')
import json
import re
import requests
import pandas as pd
import datetime
from bs4 import BeautifulSoup
import base64
import os
import random
import time
#代理池
proxy_list = [
    '127.0.0.1:15732',   #自己的代理服务器地址
    '192.168.56.1.15732'  
]
proxy = random.choice(proxy_list)
proxies = {
'http':  proxy,
'https':  proxy,
}
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
                   'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
                   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
                   'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0'
                   ]
headers = { 
       'User-Agent': random.choice(user_agents),
}
url='https://read.douban.com/provider/all'                     
cookie={'cookie':'bid=kRRUP5Adrsc; _ga=GA1.3.1583431493.1679359048; _gid=GA1.3.240421151.1679359048; _ga=GA1.1.1583431493.1679359048; page_style="mobile"; dbcl2="215291240:+lGgZ069L0g"; _pk_ses.100001.a7dd=*; ck=AT7V; _ga_RXNMP372GL=GS1.1.1679406549.4.1.1679408190.60.0.0; _pk_id.100001.a7dd=0f38c905a23f4f70.1679359049.4.1679408190.1679402067.; _gat=1'}
try:
    response = requests.get(url,headers=headers,cookies=cookie,proxies=proxies)
    #将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串
    soup = BeautifulSoup(response.text,'lxml')  
    
    #返回所有的<div>所有标签
    publishes = soup.find_all('div',{'class':'provider-group'})
    pbs=[]
    item_list=[]
    #print(publishes)
    #enumerate爬虫中的遍历
    #遍历所有出版社
    #pb为当前出版社
    for index,pb in enumerate(publishes):
        #if (index<=1):
        if True:
            pb_list={}
            pb_list['item_name']=pb.find_next('div').text
            p=pb.find_next('ul')
            li_s=p.find_all('li')#li_s存储了当前出版社的所有数据。
            
        #print(li_s)
        for li in li_s:
            item_li={}
            #item_li为进入当前出版社内页书单的链接
            item_li['href']='https://read.douban.com'+li.find_next('a').get('href')

            url2=item_li['href']
            response2=requests.get(url2,headers=headers,cookies=cookie,proxies=proxies)
            soup2 = BeautifulSoup(response2.text,'lxml')  
            
            #遍历当前出版社的所有书单页面
            while soup2.find('li',class_='next')!=None:
                #booklist为当前页面的所有<div class=info>的书籍数据
                booklist=soup2.find_all('div',{'class':'info'})
                #print(booklist)
                #print(publishes2)
                #遍历当前页面的所有书籍
                #book为当前的书籍数据
                for book in booklist:
                    
                    if(book.find('h4',class_='title')==None):
                        continue
                    title =book.find('h4',class_='title').text
                    item_li['name']=title
                    if(book.find('div',class_='sales-price')!=None):
                        price=book.find('div',class_='sales-price').text
                        item_li['price']=price
                    elif(book.find('span',class_='discount-price')!=None):
                        price=book.find('span',class_='discount-price').text
                        item_li['price']=price
                    elif(book.find('span',class_='price-tag')!=None):
                        price=book.find('span',class_='price-tag').text
                        item_li['price']=price
                    else:
                        continue
                    #输出查看
                    print(f"《{title}》:{price}")#1000行截断,保存成xlsx比较好
                    #item_list用来存储要求得的书名和价格的list型数据结构,一维
                    item_list.append([title,price])
                    t = random.random() #随机大于0 且小于1 之间的小数
                    time.sleep(t)
                    
                temp2=soup2.find('li',class_='next')
                #若存在后页
                if temp2.find('a')!=None:
                    #跳转到下一页
                    url3=url2+temp2.find('a').get('href')
                    response2=requests.get(url3,headers=headers,cookies=cookie,proxies=proxies)
                    soup2 = BeautifulSoup(response2.text,'lxml') 
                else:
                    break    
    df=pd.DataFrame(item_list)
    df.columns=['书籍名称','价格']
    print(df)
    #保存到excel文件中
    df.to_excel("爬虫数据.xlsx")
except Exception as e:
    print(e)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache Paimon系列之:认识Paimon

Apache Paimon系列之&#xff1a;认识Paimon 一、认识Paimon二、统一存储三、基本概念1.文件布局2.Snapshot3.清单文件4.数据文件5.分区6.一致性保证 一、认识Paimon Apache Paimon的架构&#xff1a; 如上架构所示&#xff1a; 读/写&#xff1a;Paimon 支持多种读/写数据和…

CLion 配置 Qt 开发环境

文章目录 CLion 配置 Qt 开发环境环境说明基本配置1. 创建Qt项目2. 设置CLion工具链3. 配置外部工具 一些问题的补充 CLion 配置 Qt 开发环境 环境说明 操作系统&#xff1a;Windows 10 CLion版本&#xff1a;2023.3.4 CMake版本&#xff1a;3.27.7 Qt6版本&#xff1a;6.6…

后Xposed时代: 一篇文章看懂如何安装和使用Edxposed

文章转载于:https://blog.coderstory.cn/guide-install-edxposed/ 序言: 大名鼎鼎的xposed框架不必多说了吧&#xff0c;想要实现QQ抢红包&#xff0c;微信抢红包&#xff0c;防止消息撤回等功能必须得靠它的支持才行。xposed也是所有android系统获取root后必装的东西。但可惜…

跨境电子商务支付与结算

一、跨境电子商务支付与结算的业务架构 跨境电子商务支付与结算的业务架构&#xff0c;结合跨境电子商务支付与结算的技术架构&#xff0c;其业务架构主要包括以下五大模块 &#xff08;1&#xff09;商户模块。商户模块包括虚拟账户、管理平台、多币种收银台、争议管理。 &…

【Django开发】前后端分离美多商城项目第1篇:美多商城【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备&#xff0c;商业模式介绍&#xff0c;开发流程&#xff0c;需求分析&#xff0c;项目架构&#xff0c;创建工程&#xff0c;1. 在git平台创建工程1.B2B--…

flex弹性盒子实现左中右居中布局

1、效果展示 2、布局与样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试弹性盒子</title> </head> <body> <div class"out-parent"><div class"…

C++入门篇(2)

1. 内联函数 1.1 概念 C中&#xff0c;以 inline 修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 #include <iostream> using namespace std;int Add(int…

Java后端八股文之java基础

文章目录 0.Java 中有 8 种基本数据类型1. 为什么浮点数运算会丢失精度&#xff1f;如何解决&#xff1f;2. 面向对象的三大特征2.1 封装2.2 继承2.3 多态 3. 深拷贝和浅拷贝的区别&#xff1f;什么是引用拷贝&#xff1f;4. equals方法与“”方法4.1 4.2 equals方法 5.hashcod…

LeetCode543题:二叉树的直径(python3)

代码思路&#xff1a; 先递归调用左儿子和右儿子求得它们为根的子树的深度 L和 R &#xff0c;则该节点为根的子树的深度即为max(L,R)1。该节点的 dnode值为LR1 递归搜索每个节点并设一个全局变量 ans记录 dnode的最大值&#xff0c;最后返回 ans-1 即为树的直径。 # Definit…

蓝桥杯历年真题省赛 java b组 2016年第七届 凑算式

一、题目 凑算式 B DEF A --- ------- 10 C GHI 这个算式中A~I代表1~9的数字&#xff0c;不同的字母代表不同的数字。 比如&#xff1a; 68/3952/714 就是一种解法&#xff0c; 53/1972/486 是另一种解法。 这个算式一共有多少种解法&#xff1f; 注意&a…

数据结构---C语言版 树 图解版力扣144/94/102

树的声明&#xff1a; #include<stdio.h> #include<stdlib.h> using namespace std;typedef char BiElemType; typedef struct BiTNode{BiElemType data;struct BiTNode* lchild;struct BiTNode* rchild; }BiTNode,*BiTree; //树中任何一个节点都是一个结构体&am…

优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…

CountDownLatch介绍和使用

1. CountDownLatch是什么 CountDownLatch 是 Java.util.concurrent 包中的一个同步工具类&#xff0c;用于控制线程的执行顺序。它的主要作用是让一个或多个线程等待其他线程完成操作后再继续执行。 2. CountDownLatch 类常用方法 CountDownLatch(int count) 是 CountDownLa…

网工内推 | 国企、上市公司网工、运维,CCNA即可,补贴福利多

01 深圳新思 招聘岗位&#xff1a;网络工程师&#xff08;中电集团&#xff09; 职责描述&#xff1a; 1&#xff1a;负责办公室电脑的桌面运维&#xff0c;主要是windows维护与应用维护&#xff1b; 2&#xff1a;负责办公室网络设备配置&#xff0c;如防火墙&#xff0c;交换…

应用工程中获取Shapefile文件的图形信息并显示

本文用纯前端获取shp文件以及前后端交互的方式获取Shapefile文件中的图形信息 1.案例说明 在日常的WebGIS开发中&#xff0c;我们往往会面对&#xff0c;需要用户选择矢量数据&#xff0c;通过矢量数据中的空间范围信息&#xff0c;显示在界面上&#xff0c;并给用户的下一步…

目标检测C-RNN,Fast C-RNN,Faster C-RNN,SSD,Mask R-CNN 理论简单介绍

参考&#xff1a; https://zh-v2.d2l.ai/chapter_computer-vision/multiscale-object-detection.html R-CNN 及系列 区域卷积神经网络 region-based CNN R-CNN R-CNN首先从输入图像中选取若干&#xff08;例如2000个&#xff09;提议区域&#xff0c;并标注它们的类别和边界…

两个笔记本如何将一个笔记本作为另一个笔记本的拓展屏

需求是有两个笔记本&#xff0c;一个笔记本闲置&#xff0c;另一个笔记本是主力本。想将另一个闲置的笔记本连接到主力本上作为拓展屏使用。网上搜了好久&#xff0c;有一些人提到了&#xff0c;也有一些视频但是文章比较少。简单总结一下吧 上述需求有两种方式 第一种&#x…

学习vue3第五节(reactive 及其相关)

1、定义 reactive() 创建一个响应式代理对象&#xff0c;不同于ref()可以创建任意类型的数据&#xff0c;而reactive()只能是对象&#xff0c;会响应式的深层次解包任何属性&#xff0c;将其标注为响应式 响应式是基于ES6的proxy实现的代理对象&#xff0c;该proxy对象与原对象…

【C++】C++的初步认识

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;自律以修身&#xff0c;自省以观己。自学以长识&#xff0c;自处以蓄力。 &#x1f33b;Hi~大家好&#xff0c;这次文章是C的初步认识&#xff0c;包括从C语言到…

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…