当前位置: 首页 > news >正文

南通做网站的公司有哪些赣州有没有做网站的

南通做网站的公司有哪些,赣州有没有做网站的,电子商务公司的经营范围有哪些,佛山正规网站建设报价目录 二十一、Python爬虫的多线程爬虫21.1 多线程使用流程21.2 Queue队列模型21.3 多线程爬虫案例1) 案例分析​2) 完整程序 二十一、Python爬虫的多线程爬虫 网络爬虫程序是一种 IO 密集型程序#xff0c;程序中涉及了很多网络 和 本地磁盘的 IO 操作#xff0c;这会消耗大… 目录 二十一、Python爬虫的多线程爬虫21.1 多线程使用流程21.2 Queue队列模型21.3 多线程爬虫案例1) 案例分析​2) 完整程序 二十一、Python爬虫的多线程爬虫 网络爬虫程序是一种 IO 密集型程序程序中涉及了很多网络 和 本地磁盘的 IO 操作这会消耗大量的时间从而降低程序的执行效率而 Python 提供的多线程能够在一定程度上提升 IO 密集型程序的执行效率。 21.1 多线程使用流程 Python 提供了两个支持多线程的模块分别是 _thread 和 threading。其中 _thread 模块偏底层它相比于 threading 模块功能有限因此推荐大家使用 threading 模块。 threading 中不仅包含了 _thread 模块中的所有方法 还提供了一些其他方法如下所示 threading.currentThread() 返回当前的线程变量。threading.enumerate() 返回一个所有正在运行的线程的列表。threading.activeCount() 返回正在运行的线程数量。 线程的具体使用方法如下所示 from threading import Thread ​#线程创建、启动、回收 t Thread(target函数名) # 创建线程对象 t.start() # 创建并启动线程 t.join() # 阻塞等待回收线程创建多线程的具体流程: t_list [] for i in range(5):t Thread(target函数名)t_list.append(t)t.start() for t in t_list:t.join()除了使用该模块外您也可以使用 Thread 线程类来创建多线程。 在处理线程的过程中要时刻注意线程的同步问题即多个线程不能操作同一个数据否则会造成数据的不确定性。通过 threading 模块的 Lock 对象能够保证数据的正确性。 比如使用多线程将抓取数据写入磁盘文件此时就要对执行写入操作的线程加锁这样才能够避免写入的数据被覆盖。当线程执行完写操作后会主动释放锁继续让其他线程去获取锁周而复始直到所有写操作执行完毕。具体方法如下所示 from threading import Lock lock Lock() # 获取锁 lock.acquire() wirter.writerows(线程锁问题解决) # 释放锁 lock.release()21.2 Queue队列模型 对于 Python 多线程而言由于 GIL 全局解释器锁的存在同一时刻只允许一个线程占据解释器执行程序当此线程遇到 IO 操作时就会主动让出解释器让其他处于等待状态的线程去获取解释器来执行程序而该线程则回到等待状态这主要是通过线程的调度机制实现的。 由于上述原因我们需要构建一个多线程共享数据的模型让所有线程都到该模型中获取数据。queue队列先进先出 模块提供了创建共享数据的队列模型。比如把所有待爬取的 URL 地址放入队列中每个线程都到这个队列中去提取 URL。queue 模块的具体使用方法如下 # 导入模块 from queue import Queue q Queue() #创界队列对象 q.put(url) 向队列中添加爬取一个url链接 q.get() # 获取一个url当队列为空时阻塞 q.empty() # 判断队列是否为空True/False21.3 多线程爬虫案例 下面通过多线程方法抓取小米应用商店https://app.mi.com/中应用分类一栏所有类别下的 APP 的名称、所属类别以及下载详情页 URL。如下图所示 图1小米应用商城 抓取下来的数据 demo 如下所示 三国杀,棋牌桌游,http://app.mi.com/details?idcom.bf.sgs.hdexp.mi1) 案例分析 通过搜索关键字可知这是一个动态网站因此需要抓包分析。 刷新网页来重新加载数据可得知请求头的 URL 地址如下所示 https://app.mi.com/categotyAllListApi?page0categoryId1pageSize30其中查询参数 pageSize 参数值不变化page 会随着页码的增加而变化而类别 Id 通过查看页面元素如下所示 ul classcategory-list lia classcurrent href/category/15游戏/a/li lia href/category/5实用工具/a/li lia href/category/27影音视听/a/li lia href/category/2聊天社交/a/li lia href/category/7图书阅读/a/li lia href/category/12学习教育/a/li lia href/category/10效率办公/a/li lia href/category/9时尚购物/a/li lia href/category/4居家生活/a/li lia href/category/3旅行交通/a/li lia href/category/6摄影摄像/a/li lia href/category/14医疗健康/a/li lia href/category/8体育运动/a/li lia href/category/11新闻资讯/a/li lia href/category/13娱乐消遣/a/li lia href/category/1金融理财/a/li /ul因此可以使用 Xpath 表达式匹配 href 属性从而提取类别 ID 以及类别名称表达式如下 基准表达式xpath_bds //ul[classcategory-list]/li 提取 id 表达式typ_id li.xpath(./a/href)[0].split(/)[-1] 类型名称typ_name li.xpath(./a/text())[0]点击开发者工具的 response 选项卡查看响应数据如下所示 { count: 2000, data: [ { appId: 1348407, displayName: 天气暖暖-关心Ta从关心天气开始, icon: http://file.market.xiaomi.com/thumbnail/PNG/l62/AppStore/004ff4467a7eda75641eea8d38ec4d41018433d33, level1CategoryName: 居家生活, packageName: com.xiaowoniu.WarmWeather }, { appId: 1348403, displayName: 贵斌同城, icon: http://file.market.xiaomi.com/thumbnail/PNG/l62/AppStore/0e607ac85ed9742d2ac2ec1094fca3a85170b15c8, level1CategoryName: 居家生活, packageName: com.gbtc.guibintongcheng }, ... ...通过上述响应内容我们可以从中提取出 APP 总数量count和 APP displayName名称以及下载详情页的 packageName。由于每页中包含了 30 个 APP所以总数量count可以计算出每个类别共有多少页。 pages int(count) // 30 1下载详情页的地址是使用 packageName 拼接而成如下所示 link http://app.mi.com/details?id app[packageName]​2) 完整程序 完整程序如下所示 # -*- coding:utf8 -*- import requests from threading import Thread from queue import Queue import time from fake_useragent import UserAgent from lxml import etree import csv from threading import Lock import jsonclass XiaomiSpider(object):def __init__(self):self.url http://app.mi.com/categotyAllListApi?page{}categoryId{}pageSize30# 存放所有URL地址的队列self.q Queue()self.i 0# 存放所有类型id的空列表self.id_list []# 打开文件self.f open(XiaomiShangcheng.csv,a,encodingutf-8)self.writer csv.writer(self.f)# 创建锁self.lock Lock()def get_cateid(self):# 请求url http://app.mi.com/headers { User-Agent: UserAgent().random}html requests.get(urlurl,headersheaders).text# 解析parse_html etree.HTML(html)xpath_bds //ul[classcategory-list]/lili_list parse_html.xpath(xpath_bds)for li in li_list:typ_name li.xpath(./a/text())[0]typ_id li.xpath(./a/href)[0].split(/)[-1]# 计算每个类型的页数pages self.get_pages(typ_id)#往列表中添加二元组self.id_list.append( (typ_id,pages) )# 入队列self.url_in()# 获取count的值并计算页数def get_pages(self,typ_id):# 获取count的值即app总数url self.url.format(0,typ_id)html requests.get(urlurl,headers{User-Agent:UserAgent().random}).json()count html[count]pages int(count) // 30 1return pages# url入队函数拼接url并将url加入队列def url_in(self):for id in self.id_list:# id格式(4,pages)for page in range(1,id[1]1):url self.url.format(page,id[0])# 把URL地址入队列self.q.put(url)# 线程事件函数: get() -请求-解析-处理数据,三步骤def get_data(self):while True:# 判断队列不为空则执行否则终止if not self.q.empty():url self.q.get()headers {User-Agent:UserAgent().random}html requests.get(urlurl,headersheaders)res_html html.content.decode(encodingutf-8)htmljson.loads(res_html)self.parse_html(html)else:break# 解析函数def parse_html(self,html):# 写入到csv文件app_list []for app in html[data]:# app名称 分类 详情链接name app[displayName]link http://app.mi.com/details?id app[packageName]typ_name app[level1CategoryName]# 把每一条数据放到app_list中,并通过writerows()实现多行写入app_list.append([name,typ_name,link])print(name,typ_name)self.i 1# 向CSV文件中写入数据self.lock.acquire()self.writer.writerows(app_list)self.lock.release()# 入口函数def main(self):# URL入队列self.get_cateid()t_list []# 创建多线程for i in range(1):t Thread(targetself.get_data)t_list.append(t)# 启动线程t.start()for t in t_list:# 回收线程 t.join()self.f.close()print(数量:,self.i)if __name__ __main__:start time.time()spider XiaomiSpider()spider.main()end time.time()print(执行时间:%.1f % (end-start))运行上述程序后打开存储文件其内容如下 在我们之间-单机版,休闲创意,http://app.mi.com/details?idcom.easybrain.impostor.gtx粉末游戏,模拟经营,http://app.mi.com/details?idjp.danball.powdergameviewer.bnn三国杀,棋牌桌游,http://app.mi.com/details?idcom.bf.sgs.hdexp.mi腾讯欢乐麻将全集,棋牌桌游,http://app.mi.com/details?idcom.qqgame.happymj快游戏,休闲创意,http://app.mi.com/details?idcom.h5gamecenter.h2mgc皇室战争,战争策略,http://app.mi.com/details?idcom.supercell.clashroyale.mi地铁跑酷,跑酷闯关,http://app.mi.com/details?idcom.kiloo.subwaysurf ... ...
http://www.w-s-a.com/news/621835/

相关文章:

  • 如何建站网站十大免费建站app
  • 工作号做文案素材的网站晋城网站设计人
  • 建设部网站官网 施工许可怎样建网站 需要
  • 什么网站都能打开的浏览器同城小程序怎么推广
  • 在电脑上怎么做网站网址seo分析
  • 石家庄做网站网络公司电子商务营销推广
  • 网站开发 前端专做婚礼logo的网站
  • 同创企业网站建设拖拽建设网站源码
  • wordpress调用网站标题网站页面排版
  • 哈尔滨营销网站建设电子商城网站开发要多少钱
  • 免费织梦导航网站模板下载地址自己建站网站
  • 获取网站访客qq号码代码做抽奖网站违法吗
  • 湖南大型网站建设公司排名偷网站源码直接建站
  • 网站建设周期规划北京网站设计必看刻
  • 如何做自己的在线作品网站深圳网站设计公司的
  • 网站开发外包公司wordpress最简单模板
  • 湖南省建设人力资源网站wordpress主机pfthost
  • 淮安软件园哪家做网站各网站特点
  • 网站长尾关键词排名软件重庆荣昌网站建设
  • 建个商城网站多少钱茂名专业网站建设
  • 开通公司网站免费的网站app下载
  • 跨境电商网站模板wordpress壁纸
  • 国内做网站网站代理电子商务网站建设与维护概述
  • 如何做地方网站推广沈阳网势科技有限公司
  • 哈尔滨网站优化技术涵江网站建设
  • 做网站搞笑口号wordpress全屏动画
  • 怎么可以建网站小程序代理项目
  • 怎样做软件网站哪个网站用帝国cms做的
  • 网站开发编程的工作方法wordpress dux-plus
  • 廊坊电子商务网站建设公司网站进不去qq空间