方法是爬取百度相关搜索结果,然后通过判断同页面的百度搜索结果的域名和我的域名库的交集是否大于2,从而判断这个相关搜索是不是我所需要的。
然后循环爬取,可以积累大量同领域相关的问题。
importthreadingfromconcurrent.futuresimportThreadPoolExecutorimportrequestsfromlxmlimportetreeimportqueueimporturllibfromurllibimportparseimporturllib.requestfromurllib.parseimporturlparseimportjsonlock=threading.Lock()proxies={}#cookie自己抓headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/97.0.4692.99Safari/537.36','cookie':''}#1:循环提取队列关键词到百度搜索,提取结果页面的链接和标题。defget_domain(url):#获得主域名domain=urlparse(url).hostnamereturndomaindefget_url(baidu_url):#转换为原始urlheader=requests.head(baidu_url).headersurl=header.get('location')returnurldefget_new_key(tree):#返回新的关键词列表new_key=tree.xpath('//*[@id="rs_new"]/table/tbody/tr/td/a/@title')returnnew_keydefget_web_data(tree):#获得页面数据列表all_webdata=tree.xpath('//h3/a')web_data=[]foritinall_webdata:x=it.xpath('string(.)')web_data.append(x)returnweb_data#2:将提取出的百度链接批量转化为原始URL,提取所有原始URL的主域名与行业域名库比对(转化为set集合取交集)。defget_result(key):#获得最终关键词search_link='https://www.baidu.com/s?ie=utf-8&wd=%s&pn=20'%urllib.parse.quote(key)resp=requests.get(search_link,headers=headers,proxies=proxies)html=resp.texttree=etree.HTML(html)baidu_url=tree.xpath('//*[@id="content_left"]/div')withlock:ls=set()#不要的字典foritinbaidu_url:try:bd_url=it.xpath('h3/a/@href')[0]exceptIndexError:continueurl=get_url(bd_url)domain=get_domain(url)ls.add(domain)#根据设置的阈值(一般设置25%左右,10个链接2-3个命中即可,没有固定标准)判断是否为目标领域词,根据得到的判定选择是否提取和保存”相关搜索”词。iflen(ls&need_url)>2:new_key=get_new_key(tree)web_data=get_web_data(tree)print(f"抓取关键词【{key}】:完成")returnnew_key,web_dataelse:outcast_key.add(key)print(f"抓取关键词【{key}】:异类")if__name__=='__main__':main_key=['育儿']seen_key=set(main_key)#所需数据key_web_data=dict()outcast_key=set()#所需url的字典f=open('needurl.txt','r+',encoding='UTF-8')need_url={'www.baidu.com'}txt=f.readlines()foritintxt:need_url.add(it.strip())print('任务开始!请不要随意关闭!')#设置队列queue_key=queue.Queue()pool=ThreadPoolExecutor(50)#多线程#关键词放入队列中forkeyinseen_key:#当关键词在seen_key里queue_key.put(key)#把seen_key的关键词加入到队列中whilequeue_key.empty()==False:key=queue_key.get()#从队列获取关键词ifkeyinkey_web_data:continue#当关键词在已储存数据里,跳过ifkeyinoutcast_key:continue#当关键词在不要的关键词里,跳过try:#new_key,web_data=get_result(key)#单线程new_key,web_data=pool.submit(get_result,key).result()fornkinnew_key:ifnkinseen_key:continueseen_key.add(nk)queue_key.put(nk)key_web_data[key]=web_dataiflen(key_web_data)>=2000:print('爬取完成')break#保存成jsonjson_str=json.dumps(key_web_data,indent=4)withopen(f'{main_key[0]}data.json','a+')asjson_file:json_file.write(json_str)json_file.flush()#保存成txtwithopen(f'{main_key[0]}关键词.txt','a+',encoding='UTF-8')asdatatxt:datatxt.write(key+'\n')datatxt.flush()exceptTypeError:continue