当前位置: 首页 > 科技观察

Python数据可视化:谁是Python老大?

时间:2023-03-13 12:29:55 科技观察

有态度的学习代理池和Cookies的知识。下面我们就来练习一下搜狗搜索微信公众号文章的爬取。在崔达的书中,他使用代理IP来应对搜狗的反爬虫措施,因为同一个IP访问网页过于频繁,会跳转到验证码页面。不过时代在进步,搜狗搜索的反爬虫也??在更新。现在是IP和Cookies的双重检查。01网页分析获取微信文章信息,标题,开头,公众号,发布时间。请求方式为GET,请求URL为红框部分,后面的信息无用。02上图反爬破解是什么时候出现的?有两种,一种是重复访问相同IP的页面,另一种是重复访问相同Cookies的页面。我都有,而且挂得更快!完全爬取只成功了一次。。。因为一开始什么都没设置,然后就出现了验证码页面。然后使用代理IP,还是会跳转到验证码页面,直到***改Cookies才爬取成功。01代理IP设置defget_proxies(i):"""获取代理IP"""df=pd.read_csv('sg_effective_ip.csv',header=None,names=["proxy_type","proxy_url"])proxy_type=["{}".format(i)foriinnp.array(df['proxy_type'])]proxy_url=["{}".format(i)foriinnp.array(df['proxy_url'])]proxies={proxy_type[i]:proxy_url[i]}returnproxiesreturnproxies代理的获取和使用这里不再赘述,在上一篇文章中有提到,感兴趣的朋友可以自行前往查看。练了两天,免费IP真的没用,两秒就查到了自己的真实IP。02Cookie设置defget_cookies_snuid():"""获取SNUID值"""time.sleep(float(random.randint(2,5)))url="http://weixin.sogou.com/weixin?type=2&s_from=input&query=python&ie=utf8&_sug_=n&_sug_type_="headers={"Cookie":"ABTEST=你的参数;IPLOC=CN3301;SUID=你的参数;SUIR=你的参数"}#HEAD请求,请求资源的header响应=requests.head(url,headers=headers).headersresult=re.findall('SNUID=(.*?);expires',response['Set-Cookie'])SNUID=result[0]returnSNUIDCookies的设置整个反爬中最重要的,关键是动态改变SNUID值。原因这里就不细说了,毕竟是看了网上大神的帖子才知道的,理解还很浅。只有一次成功爬取100页、75页、50页,甚至出现***爬一爬就挂掉的情况……不想再陷入“爬-反”的泥潭climbing-anti-anti-climbing”其中,爬虫之后的东西才是我真正的目的,比如数据分析,数据可视化。所以如果你有大票,赶紧溜走,只能膜拜搜狗工程师了。03数据获取1构造请求头head="""Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding:gzip,deflateAccept-Language:zh-CN,zh;q=0.9Connection:keep-aliveHost:weixin.sogou.comReferer:'http://weixin.sogou.com/',Upgrade-Insecure-Requests:1User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36"""#不包含SNUID值cookie='yourCookies'defstr_to_dict(header):"""构造请求头,可以在不同的函数中构造不同的请求头"""header_dict={}header=header.split('\n')forhinheader:h=h.strip()ifh:k,v=h.split(':',1)header_dict[k]=v.strip()returnheader_dict2获取网页信息defget_message():"""获取网页相关信息"""failed_list=[]foriinrange(1,101):print('第'+str(i)+'page')print(float(random.randint(15,20)))#设置延时,这里是度娘查到的,据说设置了15s以上的延时,它wi不会被阻塞time.sleep(float(random.randint(15,20)))#每10页改变一次SNUID值if(i-1)%10==0:value=get_cookies_snuid()snuid='SNUID='+值+';'#设置Cookiescookies=cookie+snuidurl='http://weixin.sogou.com/weixin?query=python&type=2&page='+str(i)+'&ie=utf8'host=cookies+'\n'header=head+hostheaders=str_to_dict(header)#设置代理IPproxies=get_proxies(i)try:response=requests.get(url=url,headers=headers,proxies=proxies)html=response.textsoup=BeautifulSoup(html,'html.parser')data=soup.find_all('ul',{'class':'news-list'})lis=data[0].find_all('li')forjin(range(len(lis))):h3=lis[j].find_all('h3')#print(h3[0].get_text().replace('\n',''))title=h3[0].get_text().replace('\n','').replace(',',',')p=lis[j].find_all('p')#print(p[0].get_text())article=p[0].get_text().replace(',',',')a=lis[j].find_all('a',{'class':'account'})#print(a[0].get_text())name=a[0].get_text()span=lis[j].find_all('span',{'class':'s2'})cmp=re.findall("\d{10}",span[0].get_text())#print(time.strftime("%Y-%m-%d",time.localtime(int(cmp[0])))+'\n')date=time.strftime("%Y-%m-%d",time.localtime(int(cmp[0])))withopen('sg_articles.csv','a+',encoding='utf-8-sig')asf:f.write(title+','+article+','+name+','+date+'\n')print('Page'+str(i)+'successes')exceptExceptionase:print('Page'+str(i)+'failed')failed_list.append(i)continue#获取失败页码print(failed_list)defmain():get_message()if__name__=='__main__':main()***成功获取数据04数据可视化1微信文章发表数***0这里我们对搜索到的微信文章进行排序,找到了这十位Python高手。其实我很想知道他们是团队运营还是个人运营。不过没关系,先注意一下。这个结果也可能和我用关键字Python搜索有关。看到公众号的名字都包含Python(CSDN除外)。frompyechartsimportBarimportpandasassspddf=pd.read_csv('sg_articles.csv',header=None,names=["title","article","name","date"])list1=[]forjindf['date']:#获取文章发表年份time=j.split('-')[0]list1.append(time)df['year']=list1#选择2018年发表的文章并统计df=df.loc[df['year']=='2018']place_message=df.groupby(['name'])place_com=place_message['name'].agg(['count'])place_com.reset_index(inplace=True)place_com_last=place_com.sort_index()dom=place_com_last.sort_values('count',ascending=False)[0:10]attr=dom['name']v1=dom['count']bar=Bar("微信文章数***0",title_pos='center',title_top='18',width=800,height=400)bar.add("",attr,v1,is_convert=True,xaxis_min=10,yaxis_rotate=30,yaxis_label_textsize=10,is_yaxis_boundarygap=True,yaxis_interval=0,is_label_show=True,is_legend_show=False,label_pos='right',is_yaxis_inverse=True,is_splitline_show=False)bar.render("微信文章发表数***0.html")2时间分布微信艺术家cles发表是因为发现这里搜索的文章都是2018年以前的,这里删掉排除,并验证剩余文章的发布时间。毕竟,信息是时效性的。如果我搜索过时的信息,那将毫无意义,更不用说在瞬息万变的互联网行业了。importnumpyasnpimportpandasasddrompyechartsimportBardf=pd.read_csv('sg_articles.csv',header=None,names=["title","article","name","date"])list1=[]list2=[]forjindf['date']:#获取文章发布的年月time_1=j.split('-')[0]time_2=j.split('-')[1]list1.append(time_1)list2.append(time_2)df['year']=list1df['month']=list2#选取2018年发表的文章,进行月度统计df=df.loc[df['year']=='2018']month_message=df.groupby(['month'])month_com=month_message['month'].agg(['count'])month_com.reset_index(inplace=True)month_com_last=month_com.sort_index()attr=["{}".format(str(i)+'month')foriinrange(1,12)]v1=np.array(month_com_last['count'])v1=["{}".format(int(i))foriinv1]bar=Bar("时间分布ofWeChatarticles",title_pos='center',title_top='18',width=800,height=400)bar.add("",attr,v1,is_stack=True,is_label_show=True)bar.render("WeChatarticlereleasetimedistribution.html")3个标题,文章开头的词云来自wordcloudimportWordCloud,ImageColorGeneratorimportmatplotlib.pyplotaspltimportpandasaspdimportjiebadf=pd.read_csv('sg_articles.csv',header=None,names=["title","article","name","date"])text=''#forlineindf['article'].astype(str):(上一个词云代码)forlineindf['title']:text+=''.join(jieba.cut(line,cut_all=False))backgroud_Image=plt.imread('python_logo.jpg')wc=WordCloud(background_color='white',mask=backgroud_Image,font_path='C:\Windows\Fonts\STZHONGS.TTF',max_words=2000,max_font_size=150,random_state=30)wc.generate_from_text(text)img_colors=ImageColorGenerator(backgroud_Image)wc.recolor(color_func=img_colors)plt.imshow(wc)plt.axis('off')#wc.to_file("article.jpg")(前词云代码)wc.to_file("title.jpg")print('词云生成成功!')公众号文章标题的词云,因为是用关键字Python搜索的,所以出现在词云中的爬虫、数据分析、机器学习、人工智能必Python之后不可或缺的。你会知道目前Python的主要用途!不过Python也可以用于Web开发、GUI开发等,这里没有体现,显然不是主流。公众号文章开头的词云。记得以前写作文的时候,老师说,开头基本上决定了你的分数,所以开头一定要引用名人(古人有句话。。。)。所以公众号这篇文章应该也不例外,但是这里,感觉广告很多……当然,数据分析、机器学习、人工智能也包括在内。不知道是不是培训广告的噱头都知道。就像之前在公众号看到的一句话,好像学了Python就会有人工智能,好像要学人工智能就必须学Python。这是真的???相信每个人心里都有答案!