使用多线程爬取数据

小米应用商店抓取(多线程)

1.网址: 百度搜索 小米应用商店
2.目标: 应用分类(聊天社交)

  1. 应用名称
  2. 应用链接

3.抓取查询参数,F12->QueryString
URL: http://app.mi.com/categotyAllListApi?
params = {
page: ?
categoryId: 2
pageSize: 30
}

import requests
import time
from multiprocessing import Queue
from threading import Thread
import json
import urllib.parse

class XiaomiSpider(object):
    def __init__(self):
        self.url = 'http://app.mi.com/categotyAllListApi?'
        self.headers = {'User-Agent': 'User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'}
        # URL队列
        self.urlQueue = Queue()
        # 解析队列
        self.parseQueue = Queue()

    # URL入队列
    def getUrl(self):
        # 生成10个URL地址,放到队列中
        for page in range(50):
            params = {
                'page': str(page),
                'categoryId' : '2',
                'pageSize' : '30'
            }
            params = urllib.parse.urlencode(params)
            # 把拼接的url放到url队列中
            fullurl = self.url + params
            self.urlQueue.put(fullurl)

    # 采集线程事件函数,发请求,把html给解析队列
    def getHtml(self):
        while True:
            # 如果队列不为空,则获取url
            if not self.urlQueue.empty():
                url = self.urlQueue.get()
                # 三步走
                res = requests.get(url,headers=self.headers)
                res.encoding = 'utf-8'
                html = res.text
                # 把html发到解析队列
                self.parseQueue.put(html)
            else:
                break

    # 解析线程事件函数,从解析队列get,提取并处理数据
    def parseHtml(self):
        while True:
            # 把html转换成json格式
            try:
                html = self.parseQueue.get(block=True,timeout=2)
                hList = json.loads(html)['data']
                # hList : [{应用信息1},{},{}]
                for h in hList:
                    # 应用名称
                    name = h['displayName']
                    # 应用链接
                    d = {
                        '应用名称' : name.strip(),
                        '应用链接' : 'http://app.mi.com/details?' + h['packageName']
                    }
                    with open('xiaomi.json','a') as f:
                        f.write(str(d) + '\n')
            except:
                break


    # 主函数
    def workOn(self):
        # url入队列
        self.getUrl()
        # 存放所有采集线程对象的列表
        tList = []
        # 存放所有解析线程对象的列表
        # 采集线程开始执行
        for i in range(5):
            t = Thread(target=self.getHtml)
            tList.append(t)
            t.start()
        # 解析线程开始执行
        for i in range(5):
            t = Thread(target=self.parseHtml)
            tList.append(t)
            t.start()
        # 统一回收解析线程
        for i in tList:
            i.join()

if __name__ == '__main__':
    begin = time.time()
    spider = XiaomiSpider()
    spider.workOn()
    end = time.time()
    print('执行时间:%.2f' % (end-begin))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值