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

2024-03-10 19:28
文章标签 实践 爬虫 学科 豆瓣 xmu

本文主要是介绍【XMU学科实践二】豆瓣爬虫实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 分析豆瓣阅读网站
    • 具体步骤
      • 构造headers
      • Beautiful soup中的定位函数find() 、find_all()
  • 完整爬虫代码

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

分析豆瓣阅读网站

豆瓣阅读出版页面


request模块:

requests是python实现的简单易用的HTTP库,官网地址:http://cn.python-requests.org/zh_CN/latest/
requests.get(url)可以发送一个http get请求,返回服务器响应内容。

BeautifulSoup库:

BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库。网址:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml
BeautifulSoup(markup, “html.parser”)或者BeautifulSoup(markup, “lxml”),推荐使用lxml作为解析器,因为效率更高。

具体步骤

构造headers

Request Headers 请求头参数; 客户端请求服务端时,会发送Request Headers即请求头给服务端

user-agent 用户代理,服务器从此处知道客户端的操作系统类型和版本,电脑CPU类型,浏览器 种类版本,浏览器渲染引擎,等等。这是爬虫当中最最重要的一个请求头参数,所以一定要伪造,甚⾄至多个。如果不进行伪造,而直接使用各种爬虫框架中自定义的user-agent,很容易被封禁。

url:爬取的地址

response = requests.get(url,headers=headers)

requests.get():通过URL去向服务器发出请求,服务器再把相关内容封装成一个Response对象返回
Response对象下有四个常用的方法(status_code、content、text、encoding)

Beautiful soup中的定位函数find() 、find_all()

网页中有用的信息通常存在于网页的文本或各种不同标签的属性值,为了获取这些网页信息,需要一些查找方法获取这些文本值或标签属性,BeautifulSoup内置了一些查找方法

(1) find()方法:用于查找符合查询条件的第一 个标签节点。

(2) find_all()方法:查找所有符合查询条件的标签节点,并返回一个列表。
BeautifulSoup用法详解

完整爬虫代码

我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').textp=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):continuetitle =book.find('h4',class_='title').textitem_li['name']=titleif(book.find('div',class_='sales-price')!=None):price=book.find('div',class_='sales-price').textitem_li['price']=priceelif(book.find('span',class_='discount-price')!=None):price=book.find('span',class_='discount-price').textitem_li['price']=priceelif(book.find('span',class_='price-tag')!=None):price=book.find('span',class_='price-tag').textitem_li['price']=priceelse: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)

这篇关于【XMU学科实践二】豆瓣爬虫实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时