0开始学py爬虫(学习笔记)(第4部分)(多线程练习)

该博客通过多协程和队列技术,详细介绍了如何爬取时光网电视剧排行榜前100名的剧名、导演、主演和简介信息,并利用xlsx模块存储数据。然而,实际获取到的数据仅有90条,且在处理过程中应用了try...except结构。由于网页内容依赖JavaScript渲染,因此使用了selenium库来应对这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用多协程和队列,爬取时光网电视剧TOP100的数据(剧名、导演、主演和简介),并用xlsx模块将数据存储下来。

时光网TOP100链接:http://www.mtime.com/top/tv/top100/


#提示:
#1.分析数据存在哪里(打开“检查”工具,刷新页面,查看第0个请求,看【response】)
#2.观察网址规律(多翻几页,看看网址会有什么变化)
#3.获取、解析和提取数据(需涉及知识点:queue、gevent、request、BeautifulSoup、find和find_all)
#4.存储数据(csv本身的编码格式是utf-8,可以往open()里传入参数encoding='utf-8'。这样能避免由编码问题引起的报错。)
#注:在练习的【文件】中,你能找到自己创建的csv文件。将其下载到本地电脑后,请用记事本打开,因为用Excel打开可能会因编码问题出现乱码。

#导包
#请求top100
#1.剧名:mov_con下的px14 c_fff.text 2.导演:mov_con下的 第一个p c_fff.text 3.演员:mov_con下的 第二个p 下的a c_fff.text 数组 4.mov_con下的 mt3.text
#循环上述请求步骤10次,方可请求100条
#拿到了上一步数据,放到一个列表,循环放入csv,关闭

#导入selnuim库,等待渲染完成再爬,数据都在js里,等待插入完成再爬取
from gevent import monkey
monkey.patch_all()
import gevent,requests,openpyxl,time
from gevent.queue import Queue
from bs4 import BeautifulSoup
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器

work=Queue()#创建队列
csv_list=[]#用来插入xlsx表格的列表

url_list=['http://www.mtime.com/top/tv/top100/']#要进入请求队列的列表
url_='http://www.mtime.com/top/tv/top100/'

#使用该链接拼后面的链接
for item in range(2,10):
    url_list.append(url_+'index-'+str(item)+'.html')

#把链接加入等待队列
for item in url_list:
    work.put_nowait(item)

#队列里的任务等到某一个的时候就做doing里的事情
def doing():
    while not work.empty():#等待队列不为空的时候,当被请求执行的时候等待队列会少一个
        url=work.get_nowait()#开始一个进来的任务,等待队列减少
        driver.get(url)#请求
        time.sleep(2)#等待两秒,以防页面没有渲染完成
        items=driver.find_elements_by_class_name("mov_con")#获取该数据的列表
        
        title=""#剧名
        daoyan=""#导演
        yanyuan=""#演员
        comment=""#评论

        #数据获取处理
        for item in items:
            title=item.find_element_by_tag_name('h2').find_element_by_tag_name('a').text
            daoyan=item.find_elements_by_tag_name("p")[0].find_element_by_tag_name("a").text
            #以防没有该元素的时候程序报没有找到该元素异常
            try:
                comment=item.find_element_by_class_name("mt3").text  
            except Exception as err:
                comment=""    
            #以防没有该元素的时候程序报没有找到该元素异常,和上面分开以防上面评论异常,影响演员
            try:
                yanyuan=get_yanyuan(item.find_elements_by_tag_name("p")[1].find_elements_by_tag_name('a'))
            except Exception as err:
                yanyuan=""
            csv_list.append([title,daoyan,yanyuan,comment])#插到xlsx表格
#演员的循环
def get_yanyuan(ele):
    y_list=[]
    print(ele)
    for i in ele:
        y_list.append(i.text)
    return ",".join(y_list)

task_list=[]
#创建5个协程任务,并进入等待队列
for i in range(5):
    task=gevent.spawn(doing)
    task_list.append(task)

#执行任务
gevent.joinall(task_list)
driver.close()#关闭浏览器

wb = openpyxl.Workbook() 
sheet = wb.active
sheet.title='可恶'
sheet['A1']='剧名'
sheet['B1']='导演'
sheet['C1']='演员'
sheet['D1']='评论'

for item in csv_list:
    sheet.append(item)
wb.save('剧组.xlsx')

在这里插入图片描述

缺点一:100条数据只有90条

缺点二:try except 的使用

由于原网页的渲染时js渲染,所以要使用selenium库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值