ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python实现用线程爬虫 快速高效爬数据

2021-07-28 12:58:39  阅读:134  来源: 互联网

标签:python list 爬虫 datalist 线程 import data page


前言

线程可以高效的调用cpu,实现cpu利用的最大化,非常快速的帮助我们爬取想要的数据

一、线程的特点

线程的含义:线程相当于 一个公司的员工,也相当于 一个应用软件可以使用多个功能一样
线程的方法:Class MyThread(Thread):继承Thread父类
new Mythread()创建对象 t.start()开启线程 Thread父类的方法def run(self):
是线程要完成的任务

二、使用步骤

1.线程池

ThreadPoolexecutor(count)这个就是线程池对象 count代表在线程内的数量
我们爬取数据都是用线程池 ,线程池相当于多个线程构成一块

 with ThreadPoolExecutor(50) as t:
        for i in range(1,200):
            data = {'limit': '20',
                    'current': str(i),
                    'pubDateStartTime': '',
                    'pubDateEndTime': '',
                    'prodPcatid': '',
                    'prodCatid': '',
                    'prodName': ''}
            t.submit(download_one_page(data))#submit第一个是参数 正是线程池要干的事
            # t.submit(download_one_page,第二个参数) 第二个参数是指 传入 download_one_page中

2.引入库

代码如下(示例):

import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
import csv

3.整块代码

import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
import csv
headers = {"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0"}
data = {'limit':'20',
'current':'1',
'pubDateStartTime':'',
'pubDateEndTime':'',
'prodPcatid':'',
'prodCatid':'',
'prodName':''}
datalists = []
f = open("./北京菜价数据1.csv",mode="w",encoding="utf-8")
f = csv.writer(f)
def download_one_page(data):
    url = "http://www.xinfadi.com.cn/getPriceData.html"
    resp = requests.post(url=url,headers=headers,data=data) #可以用post方式提交表单 访问的到
    list = resp.json()
    list = list['list']# 获取数据列表
    print(len(list))  # 打印数据长度
    for i in range(len(list)):
        datalist = []
        id = list[i]['id']  # 菜的id
        name = list[i]['prodName']  # 菜名
        typeone = list[i]['prodCat']  # 一级分类
        place = list[i]['place']  # 位置
        lowPrice = list[i]['lowPrice']  # 最低价
        highPrice = list[i]['highPrice']  # 最高价
        avgPrice = list[i]['avgPrice']  # 平均价格
        datalist.append(id)
        datalist.append(name)
        datalist.append(typeone)
        datalist.append(place)
        datalist.append(lowPrice)
        datalist.append(highPrice)
        datalist.append(avgPrice)
        f.writerow(datalist)
    #     datalists.append(datalist)
    # return datalists
def main():
    pass
if __name__ == '__main__':
    #低效率事件
    """for i in range(1,14870):
        data = {'limit': '20',
                'current': str(i),
                'pubDateStartTime': '',
                'pubDateEndTime': '',
                'prodPcatid': '',
                'prodCatid': '',
                'prodName': ''}
        datalists = download_one_page(data)"""
    with ThreadPoolExecutor(50) as t:
        for i in range(1,200):
            data = {'limit': '20',
                    'current': str(i),
                    'pubDateStartTime': '',
                    'pubDateEndTime': '',
                    'prodPcatid': '',
                    'prodCatid': '',
                    'prodName': ''}
            t.submit(download_one_page(data))#submit第一个是参数 正是线程池要干的事
            # t.submit(download_one_page,第二个参数) 第二个参数是指 传入 download_one_page中
            f.close()
    print("执行完毕!")

总结

线程池的方法比较重要 submit(要执行的任务)

标签:python,list,爬虫,datalist,线程,import,data,page
来源: https://blog.csdn.net/qq_52154193/article/details/119176851

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有