08 Python网络爬虫 Beautiful Soup实战

某讯新闻图片爬取

需求:

1.图片爬取以及内容
2.新建《腾讯新闻》文件夹
3.爬取该页面的图片
4.并将图片alt的内容写在图片名称上
魏大勋回应求婚秦岚被拒:爆料是对我父母的恶意揣测,希望口下留情.png

编码思路 :

  1. 设置目标网页的url地址。

  2. 设置用户代理,模拟浏览器进行访问。

  3. 获取网页数据,通过requests库向目标url发送请求,并将响应的数据以utf-8编码格式解码,以获取html文档数据。

  4. 进行网页数据解析处理,使用BeautifulSoup库将获取到的html数据进行解析处理,提取需要的图片链接和标题信息。

  5. 处理图片链接,通过遍历获取到的图片链接列表,循环调用getImgData()函数对每个图片链接进行处理。

  6. 保存图片,使用urllib库的urlopen()函数请求图片链接,获取图片数据,并将其写入本地文件,以实现图片的保存。

  7. 输出结果,显示图片已经被保存的编号。

实现代码:

import os
import requests
from bs4 import BeautifulSoup
import urllib.request as req

# 1.设置url请求
url = "https://new.qq.com/rain/a/20230504A044FT00"
# 2.设置用户代理
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
}
# 3.获取网页数据
def getHtml():
    # 3.1 打开网页爬取网页数据
    response = requests.get(url=url,headers=headers)
    # 3.2 设置解码
    response.encoding = 'utf-8'
    # 3.3 获取网页数据
    html = response.text
    # 3.4 进行搜索处理
    soup = BeautifulSoup(html,'lxml')
    # 3.5 图片的链接处理
    # https://inews.gtimg.com/news_bt/OqROeL1vdp-Vgt504KdNG2eLGp19jKBBBmEgJ8TY-GyB8AA/1000
    #       //inews.gtimg.com/news_bt/OqROeL1vdp-Vgt504KdNG2eLGp19jKBBBmEgJ8TY-GyB8AA/1000
    content = soup.select("img[class='content-picture']")
    # 3.6 获取标题
    title = soup.select("h1")[0].get_text()
    # 3.7 循环遍历
    for tp in content:
        getImgData(tp['src'],title)


'''4.保存图片'''
index = 1
def getImgData(imgUrl,title):
    global  index
    # 4.1 爬取图片
    img = req.urlopen(url="https:"+imgUrl).read()
    # 4.2 将图片保存起来
    fileImg = open("%s%02d.png"%(title,index),'wb')
    fileImg.write(img)
    fileImg.close()
    # 4.3 输出
    print("已经写入了%d"%index)
    index+= 1

if __name__ == '__main__':
    if "腾讯新闻" not in os.listdir():
        os.mkdir("腾讯新闻")
    os.chdir("腾讯新闻")
    getHtml()

双色球数据统计与分析

需求:

https://datachart.500.com/ssq/?expect=100
1.爬取彩票网的100期数据信息
2.分布存储  期号,红色球-6,蓝色球-1
3.将存储的信息为进行分析
    3.1 红色球 100期中 出现频率最高的数据信息 排序
    3.2 蓝色球 100期中 出现频率最高的数据信息 排序
    3.3 将红色球前10和蓝色球前10 进行随机分配
    3.4 最终出现的结果为
        5个双色球 票号
                3,8,19,20,22,32   5
                3,8,19,20,22,32   5
                3,8,19,20,22,32   5
                3,8,19,20,22,32   5
                3,8,19,20,22,32   5
注意事项:
    1.解码格式设置为gb2312
    2.数据的排序以及存储
        2.1 存储 红色球 二维列表
        2.2 排序

编码思路 :

  1. 首先导入必要的库:requests、os、random、pymysql和从bs4包中导入的BeautifulSoup。

  2. 网站的URL设置。

  3. 设置一个用户代理在HTTP请求头中使用。

  4. 定义几个全局变量:qhList、redList和blueList用于存储彩票数据;redDict和blueDict用于分别存储红球和蓝球的频率计数;red10和blue10用于存储最频繁的前10个红球和蓝球;redListTwo用于以二维列表的形式存储红球。

  5. 定义getCP()函数,该函数向URL发出GET请求并使用BeautifulSoup从HTML响应中提取彩票数据。然后它调用getCountData()函数对数据进行分析。

  6. 定义getCountData()函数,该函数计算红球和蓝球的频率计数,并将最频繁的前10个红球和蓝球分别存储在red10和blue10中。然后调用getSaveData()函数将数据保存到文件中。

  7. 定义getSaveData()函数,该函数将红球和蓝球存储在一个二维列表中,然后将彩票数据(包括二维列表)写入文本文件。然后它调用getFaCai()函数对数据进行进一步分析。

  8. 定义getFaCai()函数,该函数使用彩票数据进行一些分析,并将结果存储在一个列表faList中。

实现代码:

import requests,os,random,pymysql
from bs4 import BeautifulSoup

# 1.设置url
url = "https://datachart.500.com/ssq/?expect=100"
# 2.设置用户代理
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
}
# 3.设置全局变量
qhList = []
redList = []
blueList = []
# 统计红色球和蓝色球频率值
# '12':20
redDict = {}
blueDict = {}
# 存储红色球前10个值
red10 = []
# 存储蓝色球前10个值
blue10 = []
# 红色球二维列表
redListTwo = []
# 4.获取彩票网数据页面
def getCP():
    # 4.1 获取网页对象
    response = requests.get(url=url,headers=headers)
    # 4.2 设置解码文件
    response.encoding = 'gb2312'
    # 4.3 获取bs4对象
    soup = BeautifulSoup(response.text,'lxml')
    # 4.4 获取100期的期号
    qh = soup.select("tbody[id='tdata'] td[align='center']")
    # 4.5 循环遍历qh获取td标签中的本文内容
    for qhStr in qh:
        qhList.append(int(qhStr.get_text()))
    # 4.6 红色小球(100期的所有小球号600个)
    red = soup.select("td[class='chartBall01']")
    for redStr in red:
        redList.append(int(redStr.get_text()))
    # 4.7 蓝色球
    blue = soup.select("td[class='chartBall02']")
    for blueStr in blue:
        blueList.append(int(blueStr.get_text()))
    # 4.8 数据处理分析
    getCountData()

# 5.统计频率最高的10个数
def getCountData():
    # 5.1 将红色小球以及频率值存储到redDict
    for i in range(1,34):
        # i 下标1-33
        # i = 1
        # {1:15,2:30,3:40...}
        redDict[i] = redList.count(i)
    # 5.2 将redDict进行频率值排序
    for kt in sorted(redDict.items(),
                     key=lambda kv:(kv[1],kv[0]),
                     reverse=True):
        # kt[0] ===>1,2,3,4,...3
        # kv[1] ===>频率值
        # kv[0] ===>小球号
        red10.append(kt[0])
    # 5.3 截取前十个数据
    del red10[10:]
    print('前10个红色小球:',red10)
    # 5.4 蓝色小球
    for i in range(1,17):
        blueDict[i] = blueList.count(i)
    # 5.5 循环遍历排序
    for kt in sorted(blueDict.items(),key=lambda kv:(kv[1],kv[0]),
                     reverse=True):
        blue10.append(kt[0])
    # 5.6 截取前十个蓝色小球
    del blue10[10:]
    print("前10个蓝色小球:",blue10)
    # 5.7 调用保存数据
    getSaveData()

# 6.保存数据
def getSaveData():
    # 6.1 将红色球进行二维列表设置
    lt = [0 for i in range(0,6)]
    # 6.2 将原始的数据存储到txt或者数据库中
    for ix in range(0,len(redList)):
        lt[ix%6] = int(redList[ix])
        if ix%6 == 5:
            # 二维列表
            # [[4,1,23,20,23,22],[...]]
            redListTwo.append(lt)
            lt = [0 for i in range(0,6)]
    # 6.3 设置空字符串
    data = ""
    # 6.4 循环遍历将数据设置并写入
    # 22101:3,5,8,18,22,27:10
    for i in range(0, len(qhList)):
        line = "%d:%s:%d\n" \
               % (qhList[i], ",".join('%s' % num for num in redListTwo[i]), blueList[i])
        data += line
    # 6.5 设置到文本中
    file = open("cai.txt",'w')
    file.write(data)
    file.close()
    getFaCai()

# 7.分析得到数据
def getFaCai():
    # 7.1 设置空列表
    faList = []
    # 7.2 循环遍历
    for ix in range(0,5):
        faList.append([0 for i in range(0,7)])
    # 7.3 前5个红色小球
    for i in range(0,5):
        for j in range(0,7):
            # 红色小球
            if j != 6:
                rx = random.randint(0,9)
                faList[i][j] = red10[rx]
            else:
                bx = random.randint(0,9)
                faList[i][j] = blue10[bx]
    # 7.4 输出需要购买的彩票数字
    print("购买的彩票:",faList)
    # 7.5 将数据存储到数据库中
    getSaveMySQL()

# 8.存储到数据库中
def getSaveMySQL():
    # 8.1 建立数据库通道
    conn = pymysql.connect(
        host="127.0.0.1",
        user='root',
        password='123456'
    )
    # 8.2 设置数据库名
    conn.select_db("caipiao")
    # 8.3 获取游标
    cur = conn.cursor()
    # 8.4 设置循环遍历数据
    for i in range(0,len(qhList)):
        qh = qhList[i]
        blue = blueList[i]
        red = redListTwo[i]
        sql = "insert into fa(`id`,`qh`,`red1`,`red2`,`red3`,`red4`,`red5`,`red6`,`blue`) values(null,%d,%d,%d,%d,%d,%d,%d,%d)" % (
        qh, red[0], red[1], red[2], red[3], red[4], red[5], blue)
        print(sql)
        cur.execute(sql)
    # 8.5 关闭游标以及通道
    cur.close()
    conn.commit()
    conn.close()


if __name__ == '__main__':
    getCP()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值