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