线程可以高效的调用cpu,实现cpu利用的最大化,非常快速的帮助我们爬取想要的数据
线程的含义:线程相当于 一个公司的员工,也相当于 一个应用软件可以使用多个功能一样
线程的方法:Class MyThread(Thread):继承Thread父类
new Mythread()创建对象 t.start()开启线程 Thread父类的方法def run(self):
是线程要完成的任务
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中
代码如下(示例):
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(要执行的任务)