爬虫的操作

news2024/11/16 17:28:09

目录

爬虫基本 + re/etree/beautifulsoup+保存本地/连接数据库

基本

re

lxml/etree

beautifulsoup

保存到本地

传入数据库


大致分为

爬虫基本 + re/etree/beautifulsoup+保存本地/连接数据库

基本

爬一个很简单的百度新闻热搜

爬排名 热搜名 和热搜指数

百度热搜

 

我们直接开始分析

其实这个页面很简单 就是在自己页面的源代码上

也不需要什么分析直接爬源代码即可

 这里就是很简单的爬源代码

import requests
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua

def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    print(content)
    return content
if __name__ == "__main__":
    content=content()

 

 我们爬完的数据

这里就分为3个模块

re

输入放入里面开始分析

regex101: build, test, and debug regex

<div class="c-single-text-ellipsis">  (.*?) </div>

报错使用
<div class="c-single-text-ellipsis">  (.*?) <\/div>

 这里我们就能发现规律

标题都是在 <div></div>中的

<div class="c-single-text-ellipsis">  (.*?) </div>
报错使用
<div class="c-single-text-ellipsis">  (.*?) <\/div>

 这里我们就匹配了我们的标题

接下来要匹配热搜指数

 同样的道理 进行匹配

 <div class="hot-index_1Bl1a"> (.*?) <\/div>

 这里我就得出了匹配代码 我们可以继续开始写了

import requests
import re
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua

def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    # print(content)
    return content
def re_text(content):
    fire=re.findall("""<div class="hot-index_1Bl1a"> (.*?) </div>""",content)
    title=re.findall("""<div class="c-single-text-ellipsis">  (.*?) </div>""",content)
    print(fire,title)
    print(len(fire),len(title))
if __name__ == "__main__":
    content=content()
    re_text(content)

 这里就得出来数据

lxml/etree

这里我们使用工具xpath helper

shift+ctrl+x打开工具

按住shift

 能提取出路径

然后我们开始删除前面的路径看看能不能进行贪婪提取

 发现我们提取出来了所有标题

//div[@class='c-single-text-ellipsis']

那我们要提取热搜指数

也是一样的

//div[@class='hot-index_1Bl1a']

我们开始写代码

import requests
import re
from lxml import etree
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua

def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    # print(content)
    return content
def etree_text(content):   #lxml etree
    new_content=etree.HTML(content)
    fire=new_content.xpath("""//div[@class='hot-index_1Bl1a']/text()""")
    title=new_content.xpath("""//div[@class='c-single-text-ellipsis']/text()""")
    print(fire,title)
if __name__ == "__main__":
    content=content()
    etree_text(content)

beautifulsoup

这个工具我自己感觉很好用

我们直接打开网站

对我们想要的数据进行检查

 然后选择右键 复制 css路径

 复制即可 然后我们开始调用 beautifulsoup的select函数开始查找即可  然后需要调用 .get_text()方法取得内容

标题和指数都是这样

import requests
from bs4 import BeautifulSoup
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua

def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    # print(content)
    return content
def beau_text(content):
    soup=BeautifulSoup(content,'html.parser')    #使用py自带的html.parser解析器
    # print(soup.prettify())    #内容格式化输出
    # print(soup.body)
    title= soup.select('html body div div#sanRoot.wrapper.c-font-normal.rel main.rel.container_2VTvm div.container.right-container_2EFJr div.container-bg_lQ801 div div.category-wrap_iQLoo.horizontal_1eKyQ div.content_1YWBm a.title_dIF3B div.c-single-text-ellipsis')
    title2=[]
    for i in title:
        title=i.get_text()
        # print(title)
        title2.append(title)    #这里我们就取得了热搜名字
    fire=soup.select('html body div div#sanRoot.wrapper.c-font-normal.rel main.rel.container_2VTvm div.container.right-container_2EFJr div.container-bg_lQ801 div div.category-wrap_iQLoo.horizontal_1eKyQ div.trend_2RttY.hide-icon div.hot-index_1Bl1a')
    fire2=[]
    for i in fire:
        fire=i.get_text()
        fire2.append(fire)   #获取热搜指数

if __name__ == "__main__":
    content=content()
    beau_text(content)

这里三大项就结束了

我们开始保存本地和数据库

保存到本地

import requests
import re
from lxml import etree
from bs4 import BeautifulSoup
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua

def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    # print(content)
    return content
def to_txt(fire,title):
    content=[]
    for i in range(0,len(title)):
        content.append(str(i)+fire[i]+title[i])
    with open('百度新闻.txt','w',encoding='utf-8')as fp:
        for i in content:
            fp.write(i+'\n')

if __name__ == "__main__":
    content=content()
    fire,title=beau_text(content)
    to_txt(fire,title)

传入数据库

我们先要在数据库中设立好

这里我的数据库是spider  表名为百度新闻 

里面的字段

db=pymysql.connect(host="localhost",port=3306,user="root",passwd="111111",db="spider",charset="utf8")

连接数据库


cursor=db.cursor()
设置游标

全部代码

import requests
from bs4 import BeautifulSoup
import pymysql
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua
db=pymysql.connect(host="localhost",port=3306,user="root",passwd="214253551",db="spider",charset="utf8")
cursor=db.cursor()  #连接数据库
def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    # print(content)
    return content
def beau_text(content):
    soup=BeautifulSoup(content,'html.parser')    #使用py自带的html.parser解析器
    # print(soup.prettify())    #内容格式化输出
    # print(soup.body)
    title= soup.select('html body div div#sanRoot.wrapper.c-font-normal.rel main.rel.container_2VTvm div.container.right-container_2EFJr div.container-bg_lQ801 div div.category-wrap_iQLoo.horizontal_1eKyQ div.content_1YWBm a.title_dIF3B div.c-single-text-ellipsis')
    title2=[]
    for i in title:
        title=i.get_text()
        # print(title)
        title2.append(title)    #这里我们就取得了热搜名字
    fire=soup.select('html body div div#sanRoot.wrapper.c-font-normal.rel main.rel.container_2VTvm div.container.right-container_2EFJr div.container-bg_lQ801 div div.category-wrap_iQLoo.horizontal_1eKyQ div.trend_2RttY.hide-icon div.hot-index_1Bl1a')
    fire2=[]
    for i in fire:
        fire=i.get_text()
        fire2.append(fire)   #获取热搜指数
    return fire2,title2
def to_data(fire,title):
    data2=title
    data3=fire
    # sqli='delete from 百度新闻'
    # cursor.execute(sqli)
    # db.commit()
    data1=[]
    for i in range(0,len(title)):
        data1.append(i+1)
        sql="INSERT INTO 百度新闻 (id,title,fire) VALUES ( '" + str(data1[i]) + "', '" + data2[i] + "', '" + data3[i] + "');"
        # print(sql)
        try:
            db.ping(reconnect=True)
            cursor.execute(sql)
            db.commit()
            # print('ok')
        except Exception as err:
            #     # 检查异常原因是否是感兴趣的
            result1 = re.search('Duplicate entry.*key.*PRIMARY', str(err))
            #     # 如果是,什么都不用做
            #     # 否则(也不知道是什么原因),那就回滚吧
            if (result1 == None):
                #         # 如果发生错误则回滚
                db.rollback()
                # 关闭数据库连接
        db.close()
if __name__ == "__main__":
    content=content()
    fire,title=beau_text(content)    #beautifulsoup
    to_data(fire,title)

这里就是全部的代码了 数据库的代码

后面还有一个 是全部全类型的代码 这个只是简单的爬虫

import requests
import re
from lxml import etree
from bs4 import BeautifulSoup
import pymysql
url='https://top.baidu.com/board?tab=realtime'
headers = {
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'
    } #伪造ua
db=pymysql.connect(host="localhost",port=3306,user="root",passwd="214253551",db="spider",charset="utf8")
cursor=db.cursor()
def content():
    resposne=requests.get(url=url,headers=headers)
    resposne.encoding='utf-8'
    content=resposne.text
    # print(content)
    return content
# def re_text(content):   #re正则
#     fire=re.findall("""<div class="hot-index_1Bl1a"> (.*?) </div>""",content)
#     title=re.findall("""<div class="c-single-text-ellipsis">  (.*?) </div>""",content)
#     print(fire,title)
#     print(len(fire),len(title))
# def etree_text(content):   #lxml etree
#     new_content=etree.HTML(content)
#     fire=new_content.xpath("""//div[@class='hot-index_1Bl1a']/text()""")
#     title=new_content.xpath("""//div[@class='c-single-text-ellipsis']/text()""")
#     print(fire,title)





def beau_text(content):
    soup=BeautifulSoup(content,'html.parser')    #使用py自带的html.parser解析器
    # print(soup.prettify())    #内容格式化输出
    # print(soup.body)
    title= soup.select('html body div div#sanRoot.wrapper.c-font-normal.rel main.rel.container_2VTvm div.container.right-container_2EFJr div.container-bg_lQ801 div div.category-wrap_iQLoo.horizontal_1eKyQ div.content_1YWBm a.title_dIF3B div.c-single-text-ellipsis')
    title2=[]
    for i in title:
        title=i.get_text()
        # print(title)
        title2.append(title)    #这里我们就取得了热搜名字
    fire=soup.select('html body div div#sanRoot.wrapper.c-font-normal.rel main.rel.container_2VTvm div.container.right-container_2EFJr div.container-bg_lQ801 div div.category-wrap_iQLoo.horizontal_1eKyQ div.trend_2RttY.hide-icon div.hot-index_1Bl1a')
    fire2=[]
    for i in fire:
        fire=i.get_text()
        fire2.append(fire)   #获取热搜指数
    return fire2,title2

# def to_txt(fire,title):    #保存到本地
#     content=[]
#     for i in range(0,len(title)):
#         content.append(str(i)+fire[i]+title[i])
#     with open('百度新闻.txt','w',encoding='utf-8')as fp:
#         for i in content:
#             fp.write(i+'\n')
def to_data(fire,title):
    data2=title
    data3=fire
    # sqli='delete from 百度新闻'
    # cursor.execute(sqli)
    # db.commit()
    data1=[]
    for i in range(0,len(title)):
        data1.append(i+1)
        sql="INSERT INTO 百度新闻 (id,title,fire) VALUES ( '" + str(data1[i]) + "', '" + data2[i] + "', '" + data3[i] + "');"
        # print(sql)
        try:
            db.ping(reconnect=True)
            cursor.execute(sql)
            db.commit()
            # print('ok')
        except Exception as err:
            #     # 检查异常原因是否是感兴趣的
            result1 = re.search('Duplicate entry.*key.*PRIMARY', str(err))
            #     # 如果是,什么都不用做
            #     # 否则(也不知道是什么原因),那就回滚吧
            if (result1 == None):
                #         # 如果发生错误则回滚
                db.rollback()
                # 关闭数据库连接
        db.close()
if __name__ == "__main__":
    content=content()
    # re_text(content)     #正则
    # etree_text(content)   #lxml etree
    fire,title=beau_text(content)    #beautifulsoup
    # to_txt(fire,title)          #保存到本地
    to_data(fire,title)

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

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

相关文章

Lucid VS 特斯拉电驱系统

Lucid如何用更小的电机赶超特斯拉 Lucid 称其电机设计是小型化的&#xff0c;并且一直自夸其Air电动汽车中轻型且“紧凑“的电机轻便到可以放进登机行李箱中。然而&#xff0c;小型只是一个方面。Lucid的电机每个重只有67磅&#xff0c;能够产生670马力的动力&#xff0c;你没…

JAVA 生成微信小程序码-分享码

JAVA生成小程序码(太阳码) 工具类是获取token使用; appId 小程序appID appSecret 小程序秘钥 小程序中得配置分享项&#xff0c;不然图片是裂开的。 开发>开发管理>开发设置 nginx 配置 location ~ ^/share { #、share 你的访问路径default_type text/html;alias /d…

Dart 3.0 语法新特性 | 模式匹配 Patterns

theme: cyanosis 一、 Patterns 是什么 下面是官方对 Patterns 特性的说明 patterns :\ 从下面的第一句中可以知道&#xff0c;Patterns 是一种语法级的特性&#xff0c;而语法特性是一种语言的根基。 Patterns are a syntactic category in the Dart language, like statement…

10 缓存双写一致性之更新策略探讨

什么是缓存双写一致性 如果redis中有数据&#xff1a;需要和数据库中的值相同如果redis中无数据&#xff1a;数据库中的值要是最新值 缓存按照操作来分&#xff0c;有细分2种 只读缓存读写缓存 同步直写策略&#xff1a;写缓存时也同步写数据库&#xff0c;缓存和数据库中的…

如何移动下载文件夹到另一个盘?

下载文件夹占用了越来越多的C盘可用空间&#xff1f;本教程将教你如何安全易行地将下载文件夹移动到其他驱动器&#xff0c;以便你可以释放更多的C盘空间。 关于下载文件夹 从网站下载程序后它们会被存储在哪里&#xff1f;一般来说&#xff0c;当你从互联…

基于C++实现的智慧农业移动巡检系统设计(附源码)

Overview 项目源码 https://download.csdn.net/download/DeepLearning_/87863659 此项目开始于2023年2月7日&#xff0c;项目内容为一种AGV图形化操作系统&#xff0c;采用ROS2GO开发&#xff0c;开发环境为Ubuntu18.04、ROS melodic、Qt5.9.9&#xff0c;该项目作为23年挑战杯…

js函数this指向

目录 this的绑定规则  绑定一&#xff1a;默认绑定&#xff1b; ​ 绑定二&#xff1a;隐式绑定&#xff1b; ​ 绑定三&#xff1a;显式绑定&#xff1b; 通过call或者apply绑定this对象  绑定四&#xff1a;new绑定&#xff1b; 内置函数的绑定 this绑定规则的…

给电脑重装系统的时间需要多久才能装好

在进行电脑重装系统时&#xff0c;如果遇到系统安装时间过长的情况&#xff0c;可能会引起用户的困惑和不安。本文将介绍一些常见的原因和解决方法&#xff0c;以帮助您理解并应对系统安装时间过长的情况。 ​工具/原料&#xff1a; 系统版本&#xff1a;Windows 10 专业版 品…

《Java并发编程实战》课程笔记(九)

Semaphore&#xff1a;如何快速实现一个限流器&#xff1f; 信号量模型 信号量模型还是很简单的&#xff0c;可以简单概括为&#xff1a;一个计数器&#xff0c;一个等待队列&#xff0c;三个方法。 在信号量模型里&#xff0c;计数器和等待队列对外是透明的&#xff0c;所以…

chatgpt赋能python:Python图片大小设置的SEO指南

Python 图片大小设置的SEO指南 在网站设计和开发中&#xff0c;图片大小通常是一个重要的问题。合适的图片大小可以极大地影响用户体验和搜索引擎优化&#xff08;SEO&#xff09;结果。Python是一种广泛使用的编程语言&#xff0c;可以用来控制和设置图片大小。在本文中&…

BUUCTF MD5

密文&#xff1a; e00cf25ad42683b3df678c61f42c6bda 简述&#xff1a; 一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串&#xff0c;字母大小写统一&#xff1b;如果出现这个范围以外的字符说明这可能是个错误的md5值&#xff0c;就没必要再拿去解密了。 特征&…

SQL-DDL操作数据库、表

SQL-DDL操作数据库、表 1 DDL:操作数据库 1.1 查询数据库 查询所有的数据库 SHOW DATABASES; show databases;1.2 创建数据库 创建数据库 CREATE DATABASE 数据库名称; create database 数据库名称;创建数据库(判断&#xff0c;如果不存在则创建) CREATE DATABASE IF NOT…

SyntaxError:Unexpected end of JSON input while parsing near xxxxx 报错及解决

环境&#xff1a;Node 12.21.0、npm 6.14.11 &#xff08;其他版本也会出现这样的问题&#xff09; 找到报错日志并进行查看&#xff1a; less /Users/roc/.npm/_logs/2023-06-05T02_23_51_747Z-debug.log报错信息如下&#xff1a; 19067 verbose stack SyntaxError: Unexp…

【遇到的问题】JAVA应用程序处于安全原因被阻止。

遇到的问题&#xff1a; 直入正题&#xff0c;远程服务器用JAVA连接KVM报以下错(如图)。 应用程序处于安全原因被阻止 无法验证证书 将不执行该应用程序 名称&#xff1a;Java viewer 发行者&#xff1a;ATEN 位置&#xff1a;https://192.168.210:443 原因&#xff1a; 通过…

vue3实现高德地图多点标注(so easy)

vue3实现高德地图多点标注&#xff08;so easy&#xff09; 前言思路清晰&#xff0c;抽丝剥茧必要的准备工作最简单的部分处理数据之前&#xff08;最关键的思路&#xff09;效果完整代码 前言 非常感谢你能打开这篇博客&#xff0c;我想你一定是遇到了地图多点标注有关的问题…

采购管理系统对企业有什么作用?原来用零代码搭建如此便捷

什么是采购管理系统&#xff1f; 采购管理系统是一种企业内部管理软件&#xff0c;用于协调和管理企业的采购过程。它涵盖了采购计划、询价、比价、采购订单、采购合同、采购收货、发票等一系列采购环节&#xff0c;以及与供应商的信息和交流。其主要目的是&#xff1a;优化采…

M12圆形连接器公母对接带线3PIN4PIN

随着工业自动化的发展&#xff0c;M12圆形连接器公母对接带线3PIN4PIN作为一种重要的连接器件&#xff0c;被广泛应用于各种工业设备中。本文将详细介绍M12连接器的特点以及应用场景&#xff0c;为大家解答M12连接器的相关问题。 M12连接器主要由连接器头、插座和电缆组成&…

【Web网站服务】Nginx Rewrite重写模块

Nginx Rewrite 一、常用的Nginx 正则表达式二、location 匹配的范围2.1location实验 三、rewrite模块3.1rewrite跳转3.2rewrite执行顺3.3flag标记说明3.4rewrite中常用的全局变量3.5rewrite实验3.5.1 基于域名的跳转3.5.2基于客户端IP访问跳转3.5.3基于旧域名跳转到新域名后面加…

三、HAL_无源蜂鸣器的驱动

1、开发环境 (1)KeilMDK&#xff1a;V5.38.0.0 (2)STM32CubeMX&#xff1a;V6.8.1 (3)MCU&#xff1a;STM32F407ZGT6 2、无源蜂鸣器简介 无源蜂鸣器内部没有振荡源&#xff0c;需要采用一定频率的方波才能驱动发声。详情参开以下文章。 八、51单片机之蜂鸣器_51蜂鸣器_朱嘉…

DINO代码学习笔记(三)

DINO代码学习笔记&#xff08;一&#xff09;中已经将输入transformer之前的参数处理给捋了一遍 DINO代码学习笔记&#xff08;二&#xff09;中将encoder部分给捋了一遍 本篇进入decoder&#xff0c;这里先对encoder做一些假设&#xff0c;基于DINO代码学习笔记&#xff08;…