采集下拉框多线程-正则-多进程

成果

和之前的多进程相比,这个实用点,原来那个并没有处理好循环中的重复采集问题,实际上是不能用于多进程的
改动如下:
所有的读写操作都放在最后一步执行,这样能避免一些复杂的情况,减少涉及的参数
读取的东西化作数列或者会比较好
def read(kw,zm1s):
所有的读写操作只发生在final(kw)
记住return只能返回一次,然后函数就结束了
稍微引入了json
其他变化不大

import requests
import re
import time
import json
from multiprocessing import Pool
time1 = time.strftime("%H:%M:%S").replace(':','')
def get_baidu_dasou(keyword ='剑圣'):
    try:
        url1 = 'http://suggestion.baidu.com/su?json=1&p=3?wd=' + keyword
        url2 = 'http://suggestion.baidu.com/su?sugmode=2&json=1&wd=' + keyword
        reslt_baidu_dasou1 = requests.get(url1).text
        reslt_baidu_dasou2 = requests.get(url2).text
        reslt_baidu_dasou1 = reslt_baidu_dasou1.replace('window.baidu.sug(', '').replace(')', '').replace(';', '')
        reslt_baidu_dasou2 = reslt_baidu_dasou2.replace('window.baidu.sug(', '').replace(')', '').replace(';', '')
        jcont_reslt_baidu_dasou1 = json.loads(reslt_baidu_dasou1)
        jcont_reslt_baidu_dasou2 = json.loads(reslt_baidu_dasou2)
        final_longtaikeywords = set(jcont_reslt_baidu_dasou1['s']) | set(jcont_reslt_baidu_dasou2['s'])  # 取集合交集
        print(str(keyword)+':'+str(final_longtaikeywords))
        return list(final_longtaikeywords) #返回的是数列
    except Exception as e:
        print(e)
        time.sleep(5)

def get_sougou(keyword ='剑圣'):
    final_longtaikeywords=[]
    try:
        urlsougou = 'https://www.sogou.com/suggnew/ajajjson?key='+ keyword+'&type=web&ori=yes&pr=web'
        reslt_sougou_dasou1 = requests.get(urlsougou).text
        reslt_sougou_dasou1=reslt_sougou_dasou1.split('[')[2] #获得中间的长尾词结果
        kws = re.compile(r'"(.*?)",')
        kws_list_dasou1 = kws.findall(reslt_sougou_dasou1)
        for kws1 in kws_list_dasou1:
            final_longtaikeywords.append(kws1)
        print(str(keyword)+':'+str(final_longtaikeywords))
        return (final_longtaikeywords) #返回的是数列
    except Exception as e:
        print(e)
        time.sleep(5)

def get_360(keyword ='剑圣'):
    final_longtaikeywords=[]
    try:
        url360 = 'http://sug.so.360.cn/suggest?encodein=utf-8&encodeout=utf-8&format=json&fields=word,obdata&word=' + keyword
        reslt_360_dasou1 = requests.get(url360).text
        json_reslt_360 = json.loads(reslt_360_dasou1)
        for i in range(0, len(json_reslt_360['result'])):
            final_longtaikeywords.append(json_reslt_360['result'][i]['word'])
        print(str(keyword) + ':' + str(final_longtaikeywords))
        return (final_longtaikeywords)  # 返回的是数列
    except Exception as e:
        print(e)
        time.sleep(5)

def read(kw,zm1s):
    final_longtais=[]
    last_longtais=[]
    for zm1 in zm1s:
        print('百度搜索:'+kw+zm1)#是否还要判断
        final_longtais.append(get_baidu_dasou(kw+zm1))
        print('百度搜索:'  + zm1+ kw)
        final_longtais.append(get_baidu_dasou(zm1+kw))#其他搜索引擎
        print('搜狗搜索:' + kw + zm1)
        final_longtais.append(get_sougou(kw + zm1))#搜狗不做
        print('360搜索:' + kw + zm1)
        final_longtais.append(get_360(kw + zm1))
        print('360搜索:' + zm1+ kw)
        final_longtais.append(get_360(zm1+ kw))
        if final_longtais!=None:
            for final_longtai in final_longtais: #第一层数列
                if final_longtai != None:
                    for each_word in final_longtai:  #数列中的数列
                        last_longtais.append(each_word)
        last_longtais2=quchong(last_longtais)
    print(last_longtais2)
    print(len(last_longtais2)) #执行完return就结束了,所以这里只能返回一个数列
    return last_longtais2

def quchong(firstlist): # 去重
    last_firstlist = list(set(firstlist))
    last_firstlist.sort(key=firstlist.index)
    return last_firstlist

def final(kw):
    resultpath= r'C:/Users/Administrator/Desktop/result/xiala/'+time1+'resultkeywords.txt'
    finalpath = r'C:/Users/Administrator/Desktop/result/xiala/'+time1+'finalkeywords.txt'
    lastpath = r'C:/Users/Administrator/Desktop/result/xiala/' +time1+'lastpath.txt'
    zm1s=['',' ','a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q','r','s','t','w','x','y','z','0','1','2','3','4','5','6','7','8','9']
    #zm1s = ['','a']
    zm2s=['',' ']
    #zm2s = ['']
    finalist =[]   # 扩展第二次,存放2层列表
    finalist2= [] #存放最终的关键词
    lastlist=[]     #扩展第三次
    firstlist=read(kw,zm1s)#返回第一次排重后的数列
    with open(resultpath,'a+',encoding='utf-8')as text:
        for keywords in firstlist:
            text.write(keywords+'\n')
    lastlist=read(kw,zm1s)
    if firstlist != None:
        for kw in firstlist:
            finalist.append(read(kw, zm2s)) #二层数列
            if finalist != None:
                for final_longtai in finalist:  # 第一层数列
                    if final_longtai != None:
                        for each_word in final_longtai:  # 数列中的数列
                            finalist2.append(each_word)
                            lastlist.append(each_word)
    finalist2=quchong(finalist2)
    with open(finalpath,'a+',encoding='utf-8')as text:
        for keywords in finalist2:
            text.write(keywords+'\n')
    lastlist=quchong(lastlist)
    with open(lastpath,'a+',encoding='utf-8')as text:
        for keywords in lastlist:
            text.write(keywords+'\n')

if __name__ == '__main__':#为什么会重复了
    start = time.clock()
    pool = Pool(processes=6)
    keywords_list=[]
    startpath1 = r'C:\Users\Administrator\Desktop/result\xiala\testforkeywords.txt'  # 关键词存放的地方
    with open(startpath1, 'r', encoding='utf-8') as text:  # 打开关键词文件,做列表list
        kwsline = text.readlines()
        for kw in kwsline:
            kw = kw.strip()  # 去除空行
            kw = kw.replace('\n', '')  # 替换最后一行
            keywords_list.append(kw)
    pool.map(final,keywords_list)#这里似乎需要一次排重
    pool.close()
    pool.join()
    end = time.clock()
    print ("read: %f s" %(end - start))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 基础1.r''表示''内部的字符串默认不转义2.'''...'''表示多行内容3. 布尔值:True、False(...
    neo已经被使用阅读 1,670评论 0 5
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,119评论 0 23
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,946评论 6 13
  • 有些东西不在乎是因为你知道终其一生达不到或者拥有不了,但是不代表不渴望不向往,因为知道自己的生活是一个悲剧所以就特...
    溜溜泉阅读 138评论 0 0