您好,登录后才能下订单哦!
请求超时!
请点击重新获取二维码这篇文章主要介绍如何使用Python3制作一个带GUI界面的小说爬虫工具,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
最近帮朋友写个简单爬虫,顺便整理了下,搞成了一个带GUI界面的小说爬虫工具,用来从笔趣阁爬取小说。
1.多线程采集,一个线程采集一本小说
2.支持使用代理,尤其是多线程采集时,不使用代理可能封ip
3.实时输出采集结果
使用 threading.BoundedSemaphore() pool_sema.acquire() pool_sema.release()
来限制线程数量,防止并发线程过。具体限制数量,可在软件界面输入,默认5个线程
# 所有线程任务开始前 pool_sema.threading.BoundedSemaphore(5) # 具体每个线程开始前 锁 pool_sema.acquire() .... # 线程任务执行结束释放 pol_sema.release()
pip install requests pip install pysimplegui pip install lxml pip install pyinstaller
GUI 界面使用了一个tkinter 的封装库 PySimpleGUI
, 使用非常方便,虽然界面不够漂亮,但胜在简单,非常适合开发些小工具。https://pysimplegui.readthedocs.io/en/latest/比如这个界面的布局,只需简单几个 list
layout = [ [sg.Text('输入要爬取的小说网址,点此打开笔趣阁站点复制', font=("微软雅黑", 12), key="openwebsite", enable_events=True, tooltip="点击在浏览器中打开")], [sg.Text("小说目录页url,一行一个:")], [ sg.Multiline('', key="url", size=(120, 6), autoscroll=True, expand_x=True, right_click_menu=['&Right', ['粘贴']] ) ], [sg.Text(visible=False, text_color="#ff0000", key="error")], [ sg.Button(button_text='开始采集', key="start", size=(20, 1)), sg.Button(button_text='打开下载目录', key="opendir", size=(20, 1), button_color="#999999") ], [sg.Text('填写ip代理,有密码格式 用户名:密码@ip:端口,无密码格式 ip:端口。如 demo:123456@123.1.2.8:8580')], [ sg.Input('', key="proxy"), sg.Text('线程数量:'), sg.Input('5', key="threadnum"), ], [ sg.Multiline('等待采集', key="res", disabled=True, border_width=0, background_color="#ffffff", size=( 120, 6), no_scrollbar=False, autoscroll=True, expand_x=True, expand_y=True, font=("宋体", 10), text_color="#999999") ], ]
pyinstaller -Fw start.py
import time import requests import os import sys import re import random from lxml import etree import webbrowser import PySimpleGUI as sg import threading # user-agent header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" } # 代理 proxies = {} # 删除书名中特殊符号 # 笔趣阁基地址 baseurl = 'https://www.xbiquwx.la/' # 线程数量 threadNum = 6 pool_sema = None THREAD_EVENT = '-THREAD-' cjstatus = False # txt存储目录 filePath = os.path.abspath(os.path.join(os.getcwd(), 'txt')) if not os.path.exists(filePath): os.mkdir(filePath) # 删除特殊字符 def deletetag(text): return re.sub(r'[\[\]#\/\\:*\,;\?\"\'<>\|\(\)《》&\^!~=%\{\}@!:。·!¥……() ]','',text) # 入口 def main(): global cjstatus, proxies, threadNum, pool_sema sg.theme("reddit") layout = [ [sg.Text('输入要爬取的小说网址,点此打开笔趣阁站点复制', font=("微软雅黑", 12), key="openwebsite", enable_events=True, tooltip="点击在浏览器中打开")], [sg.Text("小说目录页url,一行一个:")], [ sg.Multiline('', key="url", size=(120, 6), autoscroll=True, expand_x=True, right_click_menu=['&Right', ['粘贴']] ) ], [sg.Text(visible=False, text_color="#ff0000", key="error")], [ sg.Button(button_text='开始采集', key="start", size=(20, 1)), sg.Button(button_text='打开下载目录', key="opendir", size=(20, 1), button_color="#999999") ], [sg.Text('填写ip代理,有密码格式 用户名:密码@ip:端口,无密码格式 ip:端口。如 demo:123456@123.1.2.8:8580')], [ sg.Input('', key="proxy"), sg.Text('线程数量:'), sg.Input('5', key="threadnum"), ], [ sg.Multiline('等待采集', key="res", disabled=True, border_width=0, background_color="#ffffff", size=( 120, 6), no_scrollbar=False, autoscroll=True, expand_x=True, expand_y=True, font=("宋体", 10), text_color="#999999") ], ] window = sg.Window('采集笔趣阁小说', layout, size=(800, 500), resizable=True,) while True: event, values = window.read() if event == sg.WIN_CLOSED or event == 'close': # if user closes window or clicks cancel break if event == "openwebsite": webbrowser.open('%s' % baseurl) elif event == 'opendir': os.system('start explorer ' + filePath) elif event == 'start': if cjstatus: cjstatus = False window['start'].update('已停止...点击重新开始') continue window['error'].update("", visible=False) urls = values['url'].strip().split("\n") lenth = len(urls) for k, url in enumerate(urls): if (not re.match(r'%s\d+_\d+/' % baseurl, url.strip())): if len(url.strip()) > 0: window['error'].update("地址错误:%s" % url, visible=True) del urls[k] if len(urls) < 1: window['error'].update( "每行地址需符合 %s84_84370/ 形式" % baseurlr, visible=True) continue # 代理 if len(values['proxy']) > 8: proxies = { "http": "http://%s" % values['proxy'], "https": "http://%s" % values['proxy'] } # 线程数量 if values['threadnum'] and int(values['threadnum']) > 0: threadNum = int(values['threadnum']) pool_sema = threading.BoundedSemaphore(threadNum) cjstatus = True window['start'].update('采集中...点击停止') window['res'].update('开始采集') for url in urls: threading.Thread(target=downloadbybook, args=( url.strip(), window,), daemon=True).start() elif event == "粘贴": window['url'].update(sg.clipboard_get()) print("event", event) if event == THREAD_EVENT: strtext = values[THREAD_EVENT][1] window['res'].update(window['res'].get()+"\n"+strtext) cjstatus = False window.close() #下载 def downloadbybook(page_url, window): try: bookpage = requests.get(url=page_url, headers=header, proxies=proxies) except Exception as e: window.write_event_value( '-THREAD-', (threading.current_thread().name, '\n请求 %s 错误,原因:%s' % (page_url, e))) return if not cjstatus: return # 锁线程 pool_sema.acquire() if bookpage.status_code != 200: window.write_event_value( '-THREAD-', (threading.current_thread().name, '\n请求%s错误,原因:%s' % (page_url, page.reason))) return bookpage.encoding = 'utf-8' page_tree = etree.HTML(bookpage.text) bookname = page_tree.xpath('//div[@id="info"]/h2/text()')[0] bookfilename = filePath + '/' + deletetag(bookname)+'.txt' zj_list = page_tree.xpath( '//div[@class="box_con"]/div[@id="list"]/dl/dd') for _ in zj_list: if not cjstatus: break zjurl = page_url + _.xpath('./a/@href')[0] zjname = _.xpath('./a/@title')[0] try: zjpage = requests.get( zjurl, headers=header, proxies=proxies) except Exception as e: window.write_event_value('-THREAD-', (threading.current_thread( ).name, '\n请求%s:%s错误,原因:%s' % (zjname, zjurl, zjpage.reason))) continue if zjpage.status_code != 200: window.write_event_value('-THREAD-', (threading.current_thread( ).name, '\n请求%s:%s错误,原因:%s' % (zjname, zjurl, zjpage.reason))) return zjpage.encoding = 'utf-8' zjpage_content = etree.HTML(zjpage.text).xpath('//div[@id="content"]/text()') content = "\n【"+zjname+"】\n" for _ in zjpage_content: content += _.strip() + '\n' with open(bookfilename, 'a+', encoding='utf-8') as fs: fs.write(content) window.write_event_value( '-THREAD-', (threading.current_thread().name, '\n%s:%s 采集成功' % (bookname, zjname))) time.sleep(random.uniform(0.05, 0.2)) # 下载完毕 window.write_event_value('-THREAD-', (threading.current_thread( ).name, '\n请求 %s 结束' % page_url)) pool_sema.release() if __name__ == '__main__': main()
以上是“如何使用Python3制作一个带GUI界面的小说爬虫工具”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
读文章网站制作什么是网站设计与制作网站作品制作简单制作动画网站无锡网站制作必咨新互动网络重庆数字网站制作流程五星服务塞班制作主题网站制作连环画 网站网站制作的介绍寻找制作网站小伙伴东方商城网站制作制作网站有哪些费用多少钱恩平国外网站制作福州制作网站公司有哪些奉贤网站设计制作电话河南数字网站制作优势苏州定制网站制作选哪家用dw怎么制作一个网站苏州网站公司制作简易网站的制作推荐如何制作一个网站的rss订阅制作网站新手用哪个ide遂宁企业网站制作设计制作好的网站下载盲人网站制作表情包福鼎企业网站制作德惠门户网站制作曼德拉电影网站制作可乐电影网站制作短视频制作免费网站高端手机网站制作南通承接网站制作扬州广陵制作网站哪家专业进出口数据网站制作桃源网站制作哪家快联众网站制作表格微商推广网站微信产品推广制作闪头像怎么制作网站金华ps网站模板怎么制作南宁网站制作好吗北京摄影网站制作广州网站制作找哪家如何制作简单的跑分网站网站首页设计图制作制作在线报名网站淮安求职网站制作HIKOREA网站制作壁纸徐州网站制作贴纸素材怎么制作商品展示网站制作网站不给源代码草根网站制作书签临沂商城网站制作滑县手工网站制作办公用品行业南山网站制作网站效果图制作书签幼儿园慈溪网站制作基本流程是什么英皇网站制作ppt邢台网站制作蛋糕材料制作购物网站流程制作网站地址图标苏州商城网站制作选哪家阳泉购物网站制作如何免费制作彩票网站交换网站制作视频黑帮电影网站制作你上个月制作的网站的英文在线网站手机模板制作制作简单的登陆网站印刷网站制作有哪些珠海网站制作美食文案苏州行业网站制作嘉兴网站制作维护制作一个网站首先要明确什么自己制作网站需要什么书政工师论文网站制作苏州网站制作需要多少钱象山港网站制作雪糕公司建设网站制作学籍查询网站制作栖霞网站制作公司和田在线网站制作口碑好的网站制作价格怎么制作小纸条网站网站制作全过程系统技术长兴动态图制作一般用什么网站公主岭网站制作哪家强制作折纸的网站北京图书大厦网站制作冰淇淋合肥建设网站制作制作微信个人网站范湖网站制作公司文档制作的网站电脑网站制作合同生物医药网站制作的软件苍南租房网站制作天文学网站制作表情包广元求职网站制作家族网站制作干花自作电路板制作网站门户网站制作头像vr网站制作加盟成都市网站制作联系方式ps手机网站制作义乌企业网站制作价格多少钱凡科快题图制作网站湖南制作网站建设案例苏州网站快速制作国内游戏制作网站有哪些昆明旅游网站制作网站首页制作流程广西网站怎么制作道滘生物医药网站制作惠氏网站制作书签惠安电脑网站制作学习资料制作网站网站制作靠谱乐云seo制作美食网站流程广东河源如何搭建网站制作出国网站制作小玩具你上个月制作的网站的英文什么网站可以制作相框网站表格制作教案如何自己在家制作网站梦幻古龙网站制作制作什么网站能盈利ui网站制作培训多少钱塔城制作网站如何制作木马网站地址如何制作一个反馈网站坪山如何制作一个网站网站制作靠谱乐云seo龙岗手机网站制作价格奉贤网站设计制作优化排名网上鲜花店的网站制作微内乡网站制作郑州 手机网站制作网站制作小黄人锦州企业网站制作服务好的网站制作推广联系电话公司内部聊天网站制作ONCE电影网站制作体育设施网站制作教程免费制作源码网站视频制作网站推荐上饶租房网站制作环境保护论文网站制作帮别人制作网站模式网站 公众号 制作 无锡上海网站制作书生商上海网站世界杯网站制作雪糕网站在哪制作钓鱼网站手机怎么制作网站制作及交易平台编写买球网站制作爱奇艺网站制作古典音乐网站制作干花沧县企业官方网站制作新民制作网站公司甘肃公司网站制作学网站制作的有接口了怎么制作网站网站首页制作流程爆米花网站视频制作dw制作植物网站永清建设网站制作手机怎么制作网站链接文登医院网站制作沧州网站商城制作b2b主图制作网站泰州门户网站制作网站制作需要什么材料制作动图视频的网站重庆渝北网站制作哪家专业直销返利网站制作ps制作网站首页步骤视频制作培训网站开发区网站制作地址河南个性化网站制作电话自己制作网站怎样申请ip象山国内信息图制作网站有哪些哪个网站可以制作动漫怎么用一个手机制作一个网站制作网站一般需要五个步骤网站制作点击弹出介绍电子制作DIY的网站寿宴邀请函制作网站网站制作公司好发信息网asp网站制作百度经验网站的设计与制作的说明书武汉网站制作公司哪家好网站制作当前位置的获取餐饮网站制作表格调查问卷的制作网站制作虚拟货币网站山东免费自己制作网站制作网站用什么字体 字号内蒙古影视网站制作黄岛品牌网站设计制作绍兴制作新闻网站策划书怎么写吕梁企业网站制作设计