py爬虫实现邮编,区号查询小程序

数据库用的是mysql
库名和表名代码里有,自己看

import requests
import xml.etree.ElementTree as ET
import pymysql
from xml.parsers.expat import ParserCreate
from tkinter import *
from tkinter.messagebox import *
import threadingclass LoginPage(object): def __init__(self, master=None): self.root = master #定义内部变量root self.root.geometry('%dx%d' % (300, 180)) #设置窗口大小 self.username = StringVar() self.password = StringVar() self.createPage() def createPage(self): self.page = Frame(self.root) #创建Frame self.page.pack() Label(self.page).grid(row=0, stick=W) Label(self.page, text = '账户: ').grid(row=1, stick=W, pady=10) Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E) Label(self.page, text = '密码: ').grid(row=2, stick=W, pady=10) Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E) Button(self.page, text='登陆', command=self.loginCheck).grid(row=3, stick=W, pady=10) Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=E) def loginCheck(self): name = self.username.get() secret = self.password.get() if name=='xzt' and secret=='666': self.page.destroy() MainPage(self.root) else: showinfo(title='错误', message='账号或密码错误!')class InputFrame(Frame): # 继承Frame类 def __init__(self, master=None):Frame.__init__(self, master) self.root = master #定义内部变量root self.itemName = StringVar() self.createPage()def createPage(self): Label(self).grid(row=0, stick=W, pady=10) Label(self, text = '城市名: ').grid(row=1, stick=W, pady=10)Entry(self, textvariable=self.itemName).grid(row=1, column=1, stick=E) Button(self, text='邮编查询',command=self.selectzip).grid(row=6, column=1, stick=E, pady=10) def selectzip(self):conn = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='pyzipdatabase', charset='utf8')cursor = conn.cursor() # 3、设置输入输出的字符编码以及自动提交 cursor.execute('set names utf8') cursor.execute('set autocommit = 1') #0:false 1:trueentryname=self.itemName.get()cursor.execute("select ZipCode from NationalZipCode where City = '%s'" %(entryname).format("Null"))result = cursor.fetchall()print(result)showinfo(message=result)cursor.close() conn.close()class QueryFrame(Frame): # 继承Frame类 def __init__(self, master=None):Frame.__init__(self, master) self.root = master #定义内部变量root self.itemName = StringVar() self.createPage()def createPage(self): Label(self).grid(row=0, stick=W, pady=10) Label(self, text = '城市名: ').grid(row=1, stick=W, pady=10)Entry(self, textvariable=self.itemName).grid(row=1, column=1, stick=E) Button(self, text='号码查询',command=self.selectnum).grid(row=6, column=1, stick=E, pady=10) def selectnum(self):conn = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='pyzipdatabase', charset='utf8')cursor = conn.cursor() # 3、设置输入输出的字符编码以及自动提交 cursor.execute('set names utf8') cursor.execute('set autocommit = 1') #0:false 1:truename=self.itemName.get()cursor.execute("select pNum from NationalZipCode where City = '%s'" %(name).format("Null"))result = cursor.fetchall()print(result)showinfo(message=result)cursor.close() conn.close()class MainPage(object): def __init__(self, master=None): self.root = master #定义内部变量root self.root.geometry('%dx%d' % (600, 400)) #设置窗口大小 self.createPage() def createPage(self): self.inputPage = InputFrame(self.root) # 创建不同Frame self.queryPage = QueryFrame(self.root) self.inputPage.pack() #默认显示数据录入界面 menubar = Menu(self.root) menubar.add_command(label='查询邮编', command = self.selectzip) menubar.add_command(label='查询长途电话前缀', command = self.selectnum) self.root['menu'] = menubar # 设置菜单栏 def selectzip(self):self.inputPage.pack() self.queryPage.pack_forget() def selectnum(self):self.queryPage.pack() self.inputPage.pack_forget() class DefaultSaxHandler(object):def __init__(self, provinces):self.provinces = provinces# 处理标签开始def start_element(self, name, attrs):if name != 'map':name = attrs['title']number = attrs['href']self.provinces.append((name, number))# 处理标签结束def end_element(self, name):pass# 文本处理def char_data(self, text):passclass ContentHandler(object):def __init__(self,content):self.content=contentdef handlestr(self):posts = self.content.split('<tr bgcolor="#ffffff">')  # posts为每一个去掉<tr bgcolor="#ffffff">组成的列表code_list = []for post in posts:if post:lines = post.strip().split('<td')if len(lines) >= 2:if 'nbsp' in lines[4]:if len(lines) >= 6:if 'nbsp' in lines[5]:test = []city = lines[1][lines[1].find('>')+len('>'):lines[1].find('</')]post_code = lines[2][lines[2].find('">')+len('">'):lines[2].find('</')]area_code = lines[3][lines[3].find('">')+len('">'):lines[3].find('</')]test.append(city)test.append(post_code)test.append(area_code)code_list.append(test)else:test = []city = lines[1][lines[1].find('<b>')+len('<b>'):lines[1].find('</')]post_code = lines[2][lines[2].find('">')+len('">'):lines[2].find('</')]area_code = lines[3][lines[3].find('">')+len('">'):lines[3].find('</')]test.append(city)test.append(post_code)test.append(area_code)code_list.append(test)else :test1 = []city = lines[1][lines[1].find('>')+len('>'):lines[1].find('</')]post_code = lines[2][lines[2].find('">')+len('">'):lines[2].find('</')]area_code = lines[3][lines[3].find('">')+len('">'):lines[3].find('</')]test1.append(city)test1.append(post_code)test1.append(area_code)code_list.append(test1)test2 = []city = lines[4][lines[4].find('>')+len('>'):lines[4].find('</')]post_code = lines[5][lines[5].find('">')+len('">'):lines[5].find('</')]area_code = lines[6][lines[6].find('">')+len('">'):lines[6].find('</')]test2.append(city)test2.append(post_code)test2.append(area_code)code_list.append(test2)self.showPost(code_list)return code_listdef showPost(self,code_list):for i in range(len(code_list)):print(code_list[i])def get_province_entry(url):# 获取文本,并用gb2312解码content = requests.get(url).content.decode('gb2312')# 确定要查找字符串的开始结束位置,并用切片获取内容。start = content.find('<map name=\"map_86\" id=\"map_86\">')end = content.find('</map>')content = content[start:end + len('</map>')].strip()
#     print(content)provinces = []# 生成Sax处理器handler = DefaultSaxHandler(provinces)# 初始化分析器parser = ParserCreate()parser.StartElementHandler = handler.start_elementparser.EndElementHandler = handler.end_elementparser.CharacterDataHandler = handler.char_data# 解析数据parser.Parse(content)# 结果字典为每一页的入口代码return provincesdef get_zipcode(url):content1 = requests.get(url).content.decode('gb18030')start = content1.find('长途区号</b></td></tr>') + len("长途区号</b></td></tr>")end = content1.find('</table>',start)
#     print(start,end)content1 = content1[start:end].strip()
#     print(content1)handler = ContentHandler(content1)code_list=[]code_list=handler.handlestr()
#     print(type(code_list))return code_listdef writedatabase(zip_list,cursor):city = zip_list[0]zipcode = zip_list[1]pnum=zip_list[2]sql  = "insert into NationalZipCode values('"+city+"','"+zipcode+"','"+pnum+"')"  #增
#     try:cursor.execute(sql)
#     except IntegrityError as e:
#         print(e)
#     print(sql)def single_thread(codes,cursor):global lockfor code in codes:code = code.strip()zip_lists=get_zipcode(code)lock.acquire()for zip_list in zip_lists :writedatabase(zip_list,cursor)lock.release()def multi_thread(tasks,cursor):# 用列表推导生成线程,注意codes后面的‘,’!threads = [threading.Thread(target = single_thread, args = (codes,cursor,)) for codes in tasks]# 启动线程for t in threads:t.start()# 等待线程结束for t in threads:t.join()lock=threading.Lock()
provinces = get_province_entry('http://www.ip138.com/post')
baseurl='http://www.ip138.com/'
conn = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='pyzipdatabase', charset='utf8')
cursor = conn.cursor() # 3、设置输入输出的字符编码以及自动提交
cursor.execute('set names utf8')
cursor.execute('set autocommit = 1') #0:false 1:true
whole_tasks=[]
for province in provinces:urlindex = province[1]realurl = baseurl+urlindexwhole_tasks.append(realurl)
thread_len = int(len(whole_tasks) / 4)
t1 = whole_tasks[0: thread_len]
t2 = whole_tasks[thread_len: thread_len * 2]
t3 = whole_tasks[thread_len * 2: thread_len * 3]
t4 = whole_tasks[thread_len * 3:]
multi_thread([t1, t2, t3, t4],cursor)
cursor.close()
conn.close()
root = Tk()
root.title('xzt的小软件')
LoginPage(root)
root.mainloop()
#     print(p)

多线程py爬虫实现邮编,区号查询小程序相关推荐

  1. SCANV团队:警惕邮编区号查询工具的高危漏洞

    近期在国内著名的第三方漏洞报告平台乌云网上,有研究者报告了一个国内知名技术媒体网站51CTO的一个安全漏洞 (http://www.wooyun.org/bugs/wooyun-2013-040647 ...

  2. 邮编区号查询 API数据接口

    邮编区号查询 计费模式 免费额度 点数单价 每日限制 会员免费 100次 免费 1000次 更新时间:2022-07-11 02:59:23接口状态:正常 根据城市名称 返回邮编 或者反之 请求地址  ...

  3. 邮编区号查询易语言代码

    .版本 2 .子程序 __启动窗口_创建完毕 '添加并使用<精易模块> Send_API () .子程序 Send_API .局部变量 REQU_Data, 文本型, , , 提交字符串 ...

  4. php正方系统抓取课表,GitHub - melodyne/school_jiaowu: PHP正方教务成绩课表爬虫,微信公众号,小程序校园应用...

    正方教务系统课表成绩爬虫 The helper of ZhengFang System 欢迎fork/star 注意,该项目针对正方教务系统编写,不保证可用于当前你学校的教务系统. 1.项目定义 这个 ...

  5. extjs 资源库云平台 2013.7.21--邮编区号查询

    为以后选省市联动(如户籍地)等准备基础数据,也提供邮编区号查询

  6. 全国邮编区号大全和从word中读取内容保存到msql中的源程序

    在网上找了好久没找到全国邮编区号的数据,没办法自己整理了一下, 程序写的很烂 进攻交流使用,如果对你有所帮助,那是我的荣幸. 里面有word格式的全国编码区号数据 我自己写的源程序. mysql数据备 ...

  7. 邮编查询/区号查询/证件查询 离线版/单机版

    受朋友之托,写了一个方便查询邮编的软件,在搜索框中直接粘贴输入完整地址,不用一个一个的去下拉框中选择, 便可跳出完整信息,闲来无事,顺便完善了一下,整个软件只有一个exe文件,完全精简化了,之前是存在 ...

  8. JSP邮编区号管理系统

    http://www.xmqbysj.com 小麻雀毕业设计 本系统是采用JSP技术开发的邮编区号管理系统.JSP技术是为实现MVC模式而开发的一个框架.它将一个体统分为三层:视图层,控制层和模型层. ...

  9. 国际长途电话区号查询

    国际长途电话区号查询 本国际长途电话区号表根据"国际电信联盟"制定的<E.164国际电信网编号>收集整理. 建议使用 Ctrl + F 进行快速查找 国际长途电话区号表 ...

最新文章

  1. Linux/windows下nginx的安装及使用
  2. QPixmap QImage 相互转化
  3. 面向全球用户的Teams app之Culture计量单位和禁忌篇
  4. java使用itext将图片放到pdf模板的指定位置
  5. rocketchat聊天服务器 v3.11.1
  6. Android基础知识、四大组件(转)
  7. 天使和恶魔差异只在一念之间
  8. 2021年上半年网络工程师上午真题及答案解析
  9. Servlet/JSP学习笔记(3)-Lomboz介绍+安装方法
  10. 四 H264解码输出yuv文件
  11. 常见库的删库命令mysql,es,neo4j,janusgraph,hbase,hive
  12. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)
  13. R语言古风诗人转职c++
  14. python读书笔记2000_python高级编程读书笔记(一)
  15. Android打开输入法和关闭输入法
  16. Jenkins 与 Gitlab 之间非交互拉取代码并进行代码部署
  17. 一千万人都在等小黄车OFO退押金
  18. Unity---Shader
  19. GoldWave V5.55 绿色汉化版_声音编辑
  20. 新库上线 | CnOpenData 新三板公司专利及引用被引用数据

热门文章

  1. 车辆合格证识别易语言代码
  2. 分糖果问题(java)
  3. mac 中 Alfred3 的使用 ..
  4. 数据库系统概论第五版(第 2 章 关系数据库)笔记
  5. 上升沿判断语句_自己明明持有着主升浪的股票却拿不住?一文教你判断主升浪的信号...
  6. Scrum板与Kanban如何抉择?敏捷工具:jlsio板与按照cnxlkfzh
  7. 如何使用vue实现搜索输入框实时查询显示
  8. 【JS】问号点和双问号的用法
  9. idea使用maven构建web应用
  10. Django实现adminx后台关闭顶部的搜索栏