wutao1935

导航

python 爬取腾讯漫画(免费)

python 爬取腾讯漫画(免费)亲测有效

  1 import requests
  2 from lxml import html
  3 from selenium import webdriver
  4 from time import sleep
  5 from bs4 import BeautifulSoup
  6 from selenium.webdriver.chrome.options import Options
  7 import os
  8 
  9 #打开腾讯动漫首页
 10 url = 'https://ac.qq.com/'
 11 #给网页发送请求
 12 data = requests.get(url).text
 13 #将网页信息转换成xpath可识别的类型
 14 htmlSrc = html.etree.HTML(data)
 15 #提取到每个漫画的目录页地址
 16 comic_list = htmlSrc.xpath('//a[@class="in-rank-name"]/@href')
 17 #print(comic_list)
 18 #遍历提取到的信息
 19 for comic in comic_list:
 20     #拼接成为漫画目录页的网址
 21     comic_url = url + str(comic)
 22     #从漫画目录页提取信息
 23     url_data = requests.get(comic_url).text
 24     #准备用xpath语法提取信息
 25     data_comic = html.etree.HTML(url_data)
 26     #提取漫画名--text()为提取文本内容
 27     name_comic = data_comic.xpath("//h2[@class='works-intro-title ui-left']/strong/text()")
 28     #提取该漫画每一页的地址
 29     item_list = data_comic.xpath("//span[@class='works-chapter-item']/a/@href")
 30     # print(name_comic)
 31     # print(item_list)
 32     #以漫画名字为文件夹名创建文件夹
 33     os.makedirs('comic/' + str(name_comic))
 34     #将一本漫画的每一章地址遍历
 35     for item in item_list:
 36         #拼接每一章节的地址
 37         item_url = url + str(item)
 38         #print(item_url)
 39         #请求每一章节的信息
 40         page_mes = requests.get(item_url).text
 41         #准备使用xpath提取内容
 42         page_ming = html.etree.HTML(page_mes)
 43         #提取章节名
 44         page_name = page_ming.xpath('//span[@class="title-comicHeading"]/text()')
 45         #print(page_name)
 46         #再以章节名命名一个文件夹
 47         os.makedirs('comic/' + str(name_comic) + '/' + str(page_name))
 48 
 49         #以下为代码的主体部分
 50 
 51         #设置谷歌无界面浏览器
 52         chrome_options = Options()
 53         chrome_options.add_argument('--headless')
 54         chrome_options.add_argument('--disable-gpu')
 55         #webdriver位置
 56         path = r'/home/jmhao/chromedriver'
 57         #浏览器参数设置
 58         browser = webdriver.Chrome(options=chrome_options)
 59         #开始请求第一个章节的网址
 60         browser.get(item_url)
 61         #设置延时,为后续做缓冲
 62         sleep(2)
 63         #browser.get_screenshot_as_file(str(page_name) + ".png")
 64         #尝试执行下列代码
 65         try:
 66             #设置自动下滑滚动条操作
 67             for i in range(1, 100):
 68                 #滑动距离设置
 69                 js = 'var q=document.getElementById("mainView").scrollTop = ' + str(i * 1000)
 70                 #执行滑动选项
 71                 browser.execute_script(js)
 72                 #延时,使图片充分加载
 73                 sleep(2)
 74             sleep(2)
 75             #将打开的界面截图保存,证明无界面浏览器确实打开了网页
 76             browser.get_screenshot_as_file(str(page_name) + ".png")
 77             #获取当前页面源码
 78             data = browser.page_source
 79             #在当前文件夹下创建html文件,并将网页源码写入
 80             fh = open("dongman.html", "w", encoding="utf-8")
 81             #写入操作
 82             fh.write(data)
 83             #关掉无界面浏览器
 84             fh.close()
 85 
 86             #下面的操作为打开保存的html文件,提取其中的图片信息,并保存到文件夹中
 87 
 88             #用beautifulsoup打开本地文件
 89             html_new = BeautifulSoup(open('dongman.html', encoding='utf-8'), features='html.parser')
 90             #提取html文件中的主体部分
 91             soup = html_new.find(id="mainView")
 92             #设置变量i,方便为保存的图片命名
 93             i = 0
 94             #提取出主体部分中的img标签(因为图片地址保存在img标签中)
 95             for items in soup.find_all("img"):
 96                 #提取图片地址信息
 97                 item = items.get("src")
 98                 #请求图片地址
 99                 comic_pic = requests.get(item).content
100                 #print(comic_pic)
101                 #尝试提取图片,若发生错误则跳过
102                 try:
103                     #打开文件夹,将图片存入
104                     with open('comic/' + str(name_comic) + '/' + str(page_name) + '/' + str(i + 1) + '.jpg', 'wb') as f:
105                         #print('正在下载第 ', (i + 1), ' 张图片中')
106                         print('正在下载' , str(name_comic) , '-' , str(page_name) , '- 第' , (i+1) , '张图片')
107                         #写入操作
108                         f.write(comic_pic)
109                         #更改图片名,防止新下载的图片覆盖原图片
110                         i += 1
111                 #若上述代码执行报错,则执行此部分代码
112                 except Exception as err:
113                     #跳过错误代码
114                     pass
115         # 若上述代码执行报错(大概率是由于付费漫画),则执行此部分代码
116         except Exception as err:
117             #跳过错误代码
118             pass

 

posted on 2021-11-19 09:25  逐风浪子  阅读(455)  评论(0编辑  收藏  举报