selenium + 异步爬取豆瓣阅读

这篇具有很好参考价值的文章主要介绍了selenium + 异步爬取豆瓣阅读。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前几天爬取豆瓣的时候,以为豆瓣是没有反爬的,直到碰到了豆瓣阅读...

这里是官网:https://read.douban.com/ebooks/?dcs=original-featured&dcm=normal-nav

需求:爬取里面13个图书类别,每个类别500本,最后保存到excel表中

selenium + 异步爬取豆瓣阅读

这是包含书本链接url的负载 ,如果有大佬可以逆向出来,就可以不用selenium

 用到的工具:asyncio,aiohttp,time,openpyxl,lxml,selenium

import asyncio
import aiohttp
import time
import openpyxl
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.by import By

先导入包

def chu(q):
    url = []
    option = webdriver.ChromeOptions()
    option.add_experimental_option('detach', True)
    driver = webdriver.Chrome(chrome_options=option)#初始化一个Chrome对象
    driver.get('https://read.douban.com/ebooks/?dcs=original-featured&dcm=normal-nav')
    #请求url
    time.sleep(2)
    #等待页面加载

    page = driver.page_source
    tree = etree.HTML(page)#解析页面源代码
    #豆瓣会对频繁访问的ip进行登陆验证,所以这里使用try防止报错
    try:
        #如果没有登陆验证的话
        lei_url = tree.xpath('//ul[@class="list kinds-list tab-panel"]//a/@href')
        #获取每个类别的url

        lei = driver.find_element(By.XPATH,f'//ul[@class="list kinds-list tab-panel"]/li/a[@href="{lei_url[q]}"]')

        lei.click()
        #模拟点击,进入类别相应的页面

    except:
        #如果有登录验证的话
        login = input('请在网页上进行登录,登录完成后输入1:')
        #手动登录,因为需要滑块验证码,本人技术层次没那么高
        time.sleep(2)
        #等待页面加载
        lei_url = tree.xpath('//ul[@class="list kinds-list tab-panel"]//a/@href')
        

        lei = driver.find_element(By.XPATH, f'//ul[@class="list kinds-list tab-panel"]/li/a[@href="{lei_url[q]}"]')
        lei.click()
        #和上面同样的做法
    count = 1
    while count <31:
        time.sleep(2)
           #等待页面加载
        page = driver.page_source
        tree = etree.HTML(page)
        #获取每本书的url
        print('正在抓取url')
        url.append(tree.xpath('//ul[@class="works-list"]/li/@to'))
        time.sleep(1)
        driver.find_element(By.XPATH,'//div[@class="paginator-full"]//a[@class="page-next"]').click()
        #模拟点击,进入下一页,循环,直到满30页
        count += 1

    driver.quit()
    return url

selenium模拟采集url,返回的数据是一个列表,每20个url为一个元素,方便后面进行异步操作。

接下来进行对书本信息进行采集

book_page = []
#用来存储书本信息
async def pa_book(url#传入url,q#判断书本类别):
#使用异步函数,大大节省运行时间
    count = 0
    b = []
    header = {
        'User-Agent': '你的ua',
        'Cookie': '浏览器里自行复制'
    }#豆瓣cookie是固定的,我们复制下来一段,保持登陆状态
    async with aiohttp.ClientSession() as session:
        #初始化一个session对象
        async with await session.get(url=url,headers=header) as resp:
            #对页面发起请求
            tree = etree.HTML(await resp.text())
            #用xpath进行解析
            try:
                #因为有些书本信息不全,防止报错,我们直接使用try
                o = 0
                zuozhe = tree.xpath('//div[@class="article-meta"]//text()')
                prise = tree.xpath('//s[@class="original-price-count"]/text()')[0]
                mingzi = tree.xpath('//span[@itemprop="itemListElement"]//span[@itemprop="name"]/text()')[0]
                pingjia = tree.xpath('//span[@class="amount"]/text()')[0]
                #存入信息
                b.append(mingzi)
                b.append(mane[q])
                b.append(zuozhe[zuozhe.index('类别') + 1])
                b.append(zuozhe[zuozhe.index('作者') + 1])
                b.append(zuozhe[zuozhe.index('出版社') + 1])
                b.append(zuozhe[zuozhe.index('提供方') + 1])
                b.append(zuozhe[zuozhe.index('字数') + 1])
                b.append(zuozhe[zuozhe.index('ISBN') + 1])

                b.append(pingjia)
                b.append(prise)
                book_page.append(b)
            except:
                #跳过不全的书本
                count += 1

这样书本信息就采集好了,接下来存入excel表中

我们需要准备一个名称为书籍.xlsx.的文件不然会报错

def cun():
    w = 2
    wb = openpyxl.load_workbook('书籍.xlsx')
    ws = wb['Sheet1']
    top = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
    for o in book_page:


        count = 0
        for j,i in zip(o,top):
            ws[f'{i}{w}'] = j
            count +=1
        w = w+1
    #这个很简单写写循环就可以了
    wb.save('书籍.xlsx')

最后一步代码运行

for q in range(14):
    p = 1
    for url in chu(q):
        task = []

        for i in url:
            task.append(pa_book(f'https://read.douban.com{i}',q))
            #注册进循环里
        print(f'正在爬取第{p}页------------')
        p += 1
        loop = asyncio.get_event_loop()

        loop.run_until_complete(asyncio.wait(task))
        #运行
        time.sleep(2)
        #等待2秒防止访问被拒
        print('success')
cun()
#存入数据

完整代码实现

import asyncio
import aiohttp
import time
import openpyxl
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.by import By
start_time = time.time()
mane = ['小说', '文学', '人文社科', '经济管理', '科技科普', '计算机与互联网', '成功励志', '生活', '少儿', '艺术设计', '漫画绘本', '教育考试', '杂志']
def chu(q):
    url = []
    option = webdriver.ChromeOptions()
    option.add_experimental_option('detach', True)
    driver = webdriver.Chrome(chrome_options=option)
    driver.get('https://read.douban.com/ebooks/?dcs=original-featured&dcm=normal-nav')

    time.sleep(2)


    page = driver.page_source
    tree = etree.HTML(page)
    try:
        lei_url = tree.xpath('//ul[@class="list kinds-list tab-panel"]//a/@href')
        lei_name = tree.xpath('//ul[@class="list kinds-list tab-panel"]//a/text()')

        lei = driver.find_element(By.XPATH,f'//ul[@class="list kinds-list tab-panel"]/li/a[@href="{lei_url[q]}"]')
        lei.click()

    except:
        login = input('请在网页上进行登录,登录完成后输入1:')
        time.sleep(2)
        lei_url = tree.xpath('//ul[@class="list kinds-list tab-panel"]//a/@href')
        lei_name = tree.xpath('//ul[@class="list kinds-list tab-panel"]//a/text()')

        lei = driver.find_element(By.XPATH, f'//ul[@class="list kinds-list tab-panel"]/li/a[@href="{lei_url[q]}"]')
        lei.click()
    count = 1
    while count <9:
        time.sleep(2)
        page = driver.page_source
        tree = etree.HTML(page)
        print('正在抓取url')
        url.append(tree.xpath('//ul[@class="works-list"]/li/@to'))
        time.sleep(1)
        driver.find_element(By.XPATH,'//div[@class="paginator-full"]//a[@class="page-next"]').click()
        count += 1

    driver.quit()
    return url
book_page = []
async def pa_book(url,q):
    count = 0
    b = []
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
        'Cookie': 'bid=eLRBZmbY55Y; dbcl2="267875740:kPdFiwjWprY"; ck=ijB_; _ga=GA1.3.133779158.1679229659; _gid=GA1.3.10458227.1679229659; _pk_ref.100001.a7dd=%5B%22%22%2C%22%22%2C1679229659%2C%22https%3A%2F%2Faccounts.douban.com%2F%22%5D; _pk_ses.100001.a7dd=*; _ga=GA1.1.133779158.1679229659; __gads=ID=de972e154c2fef7a-22a0163bd5de0064:T=1679229662:RT=1679229662:S=ALNI_MaXNgyOFMsVTnhbnDSgMLFd_tnQ5w; __gpi=UID=00000bdc08bc9484:T=1679229662:RT=1679229662:S=ALNI_MY0Iz9JEbO8VuYeFJ3xJQOu75jnQw; _ga_RXNMP372GL=GS1.1.1679229658.1.1.1679229769.56.0.0; _pk_id.100001.a7dd=d883665af68561be.1679229659.1.1679229771.1679229659.'
    }
    async with aiohttp.ClientSession() as session:
        async with await session.get(url=url,headers=header) as resp:

            tree = etree.HTML(await resp.text())
            try:
                o = 0
                zuozhe = tree.xpath('//div[@class="article-meta"]//text()')
                prise = tree.xpath('//s[@class="original-price-count"]/text()')[0]
                mingzi = tree.xpath('//span[@itemprop="itemListElement"]//span[@itemprop="name"]/text()')[0]
                pingjia = tree.xpath('//span[@class="amount"]/text()')[0]
                b.append(mingzi)
                b.append(mane[q])
                b.append(zuozhe[zuozhe.index('类别') + 1])
                b.append(zuozhe[zuozhe.index('作者') + 1])
                b.append(zuozhe[zuozhe.index('出版社') + 1])
                b.append(zuozhe[zuozhe.index('提供方') + 1])
                b.append(zuozhe[zuozhe.index('字数') + 1])
                b.append(zuozhe[zuozhe.index('ISBN') + 1])

                b.append(pingjia)
                b.append(prise)
                book_page.append(b)
            except:
                count += 1

def cun():
    w = 2
    wb = openpyxl.load_workbook('书籍.xlsx')
    ws = wb['Sheet1']
    top = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
    for o in book_page:


        count = 0
        for j,i in zip(o,top):
            ws[f'{i}{w}'] = j
            count +=1
        w = w+1
    wb.save('书籍.xlsx')

for q in range(14):
    p = 1
    for url in chu(q):
        task = []

        for i in url:
            task.append(pa_book(f'https://read.douban.com{i}',q))
        print(f'正在爬取第{p}页------------')
        p += 1
        loop = asyncio.get_event_loop()

        loop.run_until_complete(asyncio.wait(task))
        time.sleep(2)
        print('success')
cun()
end_time = time.time()
run_time = -start_time+end_time
print(f'本次运行时间为{run_time}s')

我加了一个运行时间显示

注意:1.代码运行过程中如果停止那么信息会全部丢失,前功尽弃,可以通过修改循环次数来控制爬取量

2.还是会有封ip的风险,如果没有爬过豆瓣的可以一次性爬完,可以加代理ip

本人爬虫萌新,纯粹练手,如有侵权请告知,希望大佬们多提建议文章来源地址https://www.toymoban.com/news/detail-499618.html

到了这里,关于selenium + 异步爬取豆瓣阅读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前几天面了个30岁的测试员,年薪50w问题基本都能回答上,应该刷了不少八股文···

    互联网行业竞争是一年比一年严峻,作为测试工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯等大厂.....) 所以,大家就迎来了一堆问题: 自己目前的能力能不能够支撑自己晋升?如

    2024年02月05日
    浏览(37)
  • Python爬取豆瓣电影Top 250,豆瓣电影评分可视化,豆瓣电影评分预测系统

    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 2022-2024年最全的计算机软件毕业设计选

    2024年03月21日
    浏览(72)
  • 爬取豆瓣Top250图书数据

    项目的实现步骤 1.项目结构 2.获取网页数据 3.提取网页中的关键信息 4.保存数据 1.项目结构 2.获取网页数据 对应的网址为https://book.douban.com/top250 3.提取网页中的关键信息 获取传出的解析后的数据,获取对应的图片,书名,作者,价格,评价,简介 将获取的数据存入到字典中

    2024年02月08日
    浏览(43)
  • 豆瓣读书网站的数据爬取与分析

    目录 Python应用程序设计 豆瓣读书网站的数据爬取与分析 一、 项目背景与需求分析 二、数据抓取与分析 三、数据库设计 四、展示系统 选题背景 本设计作品选取了豆瓣读书网站,主要爬取的是豆瓣读书的TOP250,通过爬取的数据进行对信息的进一步的数据分析。豆瓣读书TOP25

    2024年02月09日
    浏览(68)
  • scrapy框架简单实现豆瓣评分爬取案例

    豆瓣网址:https://movie.douban.com/top250 在spiders目录下创建一个spider_one.py文件,可以随意命名,该文件主要是让我们进行数据爬取的。 运行命令: 注意末尾的域名是用来设置爬取的范围的 spider_one.py代码如下 放开useragent,配置好对应的值 关闭robots协议 放开管道限制 在items.py文

    2024年02月14日
    浏览(32)
  • Python爬虫实战-批量爬取豆瓣电影排行信息

    大家好,我是python222小锋老师。 近日锋哥又卷了一波Python实战课程-批量爬取豆瓣电影排行信息,主要是巩固下Python爬虫基础 视频版教程: Python爬虫实战-批量爬取豆瓣电影排行信息 视频教程_哔哩哔哩_bilibili Python爬虫实战-批量爬取豆瓣电影排行信息 视频教程作者:小锋老师

    2024年02月05日
    浏览(49)
  • python爬虫小练习——爬取豆瓣电影top250

    将爬取的数据导入到表格中,方便人为查看。 三大功能 1,下载所有网页内容。 2,处理网页中的内容提取自己想要的数据 3,导入到表格中 https://www.bilibili.com/video/BV1CY411f7yh/?p=15

    2024年01月17日
    浏览(45)
  • 爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据

    以豆瓣当下实时热门电影《热烈》作为分析对象 环境: Python3(Anaconda3) PyCharm Chrome浏览器 主要模块: BeautifulSoup requests pymysql 一.概括 目标:获得电影《热烈》的用户观影习惯数据 代码概括: 1.使用requests和bs4爬取电影《热烈》所有短评长评及其用户                           

    2024年02月14日
    浏览(44)
  • 【爬虫学习】1、利用get方法对豆瓣电影数据进行爬取

    ♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油! 加油! 加油 🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+! 1、导入python库 2、获取豆瓣电影的第一页的数据 并

    2024年02月12日
    浏览(45)
  • Python爬虫:一个爬取豆瓣电影人像的小案例

    从谷歌浏览器的开发工具进入 选择图片右键点击检查 翻页之后发现网址变化的只有start数值,每次变化值为30 Python代码 把爬取的图片全部放到新建的文件夹中存放

    2024年02月10日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包