统计个人CSDN的博客文章数量

 

第一版

原始版本比较简单

只能统计第一页,而且没有进行排序

 

# coding:utf-8
import urllib2
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf-8')def getPage(): #伪装成浏览器登陆,获取网页源代码url = 'http://blog.csdn.net/qiqiyingse?viewmode=contents'totalList=[]contentList=[]headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}  req = urllib2.Request(url=url,headers=headers)try:html = urllib2.urlopen(req).read()except urllib2.HTTPError,e:print e.codeprint e.reasonfd=open('counter.txt','w')page = BeautifulSoup(html,'lxml')mytimes=page.find(id='blog_rank')i =1for aa in mytimes.find_all('li'):if i<3:print aa.textfd.write(aa.text)fd.write('\n')totalList.append(aa.text)i +=1items = page.find_all('div',class_ ='list_item list_view')print '总共有文章%d 篇' % len(items)for item in items:content=item.find('a')read_time=item.find('span',class_ ='link_view')comments_time=item.find('span',class_ ='link_comments')totalcontent=content.text.strip()+read_time.text.strip()+comments_time.text.strip()print totalcontentcontentList.append(totalcontent)fd.write(totalcontent)fd.write('\n')fd.close()return totalList,contentList
urls=getPage()

 

第二版

 

再增加一个版本

这个版本,直接能按照访问次数进行排序

2017.4.11日重新更新代码,本次更新内容:

将统计的内容,重新在程序文件下再建立一个文件夹,同时将统计内容放入到以当前时间为名字的文本中

避免了每次统计直接覆盖了上一次统计的数据

第二版

 

# coding:utf-8
import urllib2,re,datetime,os
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf-8')def getPage(): #伪装成浏览器登陆,获取网页源代码url = 'http://blog.csdn.net/qiqiyingse?viewmode=contents'baseurl='http://blog.csdn.net'totalList=[]contentList=[]sortlist=[]sortlist1=[]headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}  req = urllib2.Request(url=url,headers=headers)try:html = urllib2.urlopen(req).read()except urllib2.HTTPError,e:print e.codeprint e.reasonpath='count'if not os.path.exists(path):  os.makedirs(path) fname=path+'/'+datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')+'.txt'fd=open(fname,'w')page = BeautifulSoup(html,'lxml')mytimes=page.find(id='blog_rank')i =1for aa in mytimes.find_all('li'):if i<3:print aa.textfd.write(aa.text)fd.write('\n')totalList.append(aa.text)i +=1items = page.find_all('div',class_ ='list_item list_view')print '总共有文章%d 篇' % len(items)fd.write('总共有文章%d 篇' % len(items))fd.write('\n')for item in items:aa={}content=item.find('a')contemtUrl=baseurl+content.get('href')read_time=item.find('span',class_ ='link_view')tmp=str(read_time.text.strip())number = int(filter(str.isdigit, tmp))sortlist1.append(number)comments_time=item.find('span',class_ ='link_comments')aa['indexs']=numberaa['content']=content.text.strip()aa['read_time']=tmpaa['comments_time']=comments_time.text.strip()aa['contemtUrl']=contemtUrlsortlist.append(aa)sortlist1.sort()print sortlist1for i in sortlist1:for a in sortlist:if int(i) == int(a['indexs']):totalcontent=a['content']+'\t'+a['read_time']+'\t'+a['comments_time']+'\t'+a['contemtUrl']print totalcontentfd.write(totalcontent)fd.write('\n')contentList.append(totalcontent)fd.close()return contentList
urls=getPage()

第三版

这一个版本比较有意思

 

#coding:utf-8  
import urllib2,re,time,random,os,datetime
from bs4 import BeautifulSoup
import webbrowser as web
import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')  def getPage(): #伪装成浏览器登陆,获取网页源代码  url = 'http://blog.csdn.net/qiqiyingse?viewmode=contents'  baseurl='http://blog.csdn.net' contentList=[]  sortlist=[]sortlist1=[]urlList=[]headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}    req = urllib2.Request(url=url,headers=headers)  try:  html = urllib2.urlopen(req).read()  except urllib2.HTTPError,e:  print e.code  print e.reason  path=u'count'if not os.path.exists(path):  os.makedirs(path) 	fname=path+'/'+datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')+'.txt'	print fname	fd=open(fname,'w')page = BeautifulSoup(html,'lxml')items = page.find_all('div',class_ ='list_item list_view')  print u'总共有文章%d 篇' % len(items)  fd.write('总共有文章%d 篇' % len(items))fd.write('\n')for item in items:  aa={}  content=item.find('a')contemtUrl=baseurl+content.get('href')#print contemtUrlread_time=item.find('span',class_ ='link_view')  readtime=str(read_time.text.strip())#print readtimereadtimeNumber = int(filter(str.isdigit, readtime))#print readtimeNumbersortlist1.append(readtimeNumber)  #time.sleep(2)aa['indexs']=readtimeNumber  aa['content']=content.text.strip()  aa['read_time']=readtime   aa['contemtUrl']=contemtUrl  sortlist.append(aa)  sortlist1.sort()  print sortlist1  for i in sortlist1:  for a in sortlist:  if int(i) == int(a['indexs']):  totalcontent=a['content']+'\t'+a['read_time']+'\t'+a['contemtUrl']  print totalcontent  fd.write(totalcontent)  fd.write('\n')urlList.append(a['contemtUrl'])contentList.append(totalcontent)  fd.close()  return urlList  urls=getPage()count=random.randint(10,50)
print u'将要打开关闭浏览器次数为:',count
for i in range(5):print urls[i]j=0
while j< count:if j == 15:j=0for i in range(5):web.open_new_tab(urls[i+38])time.sleep(1)web.open_new_tab(urls[random.randint(1,44)])time.sleep(1)web.open_new_tab('http://blog.csdn.net/qiqiyingse/article/details/51801918')time.sleep(3)os.system('taskkill /f /IM Chrome.exe')j = j+1

第四版

本次更新是博客文章大于50篇以后,可能需要2页显示,但是只能统计两页内容

因此重新更新

 

#coding:utf-8  
import urllib2,re,time,random,os,datetime
from bs4 import BeautifulSoup
import webbrowser as web
import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')  def getPage(): #伪装成浏览器登陆,获取网页源代码  url1 = 'http://blog.csdn.net/qiqiyingse/article/list/1?viewmode=contents'  url2 = 'http://blog.csdn.net/qiqiyingse/article/list/2?viewmode=contents'  baseurl='http://blog.csdn.net' contentList=[]  sortlist=[]sortlist1=[]urlList=[]headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}    req1 = urllib2.Request(url=url1,headers=headers)  req2 = urllib2.Request(url=url2,headers=headers)  try:  html1 = urllib2.urlopen(req1).read()  html2 = urllib2.urlopen(req2).read()  except urllib2.HTTPError,e:  print e.code  print e.reason  path=u'count'if not os.path.exists(path):  os.makedirs(path) 	fname=path+'/'+datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')+'.txt'	print fname	fd=open(fname,'w')page1 = BeautifulSoup(html1,'lxml')page2 = BeautifulSoup(html2,'lxml')items1 = page1.find_all('div',class_ ='list_item list_view')  items2 = page2.find_all('div',class_ ='list_item list_view')  cont_print= u'总共有文章%d 篇' % (len(items1)+len(items2))print cont_printfd.write(cont_print)  fd.write('\n')for item in items1:  aa={}  content=item.find('a')contemtUrl=baseurl+content.get('href')#print contemtUrlread_time=item.find('span',class_ ='link_view')  readtime=str(read_time.text.strip())#print readtimereadtimeNumber = int(filter(str.isdigit, readtime))#print readtimeNumbersortlist1.append(readtimeNumber)  #time.sleep(2)aa['indexs']=readtimeNumber  aa['content']=content.text.strip()  aa['read_time']=readtime   aa['contemtUrl']=contemtUrl  sortlist.append(aa)for item in items2:  aa={}  content=item.find('a')contemtUrl=baseurl+content.get('href')#print contemtUrlread_time=item.find('span',class_ ='link_view')  readtime=str(read_time.text.strip())#print readtimereadtimeNumber = int(filter(str.isdigit, readtime))#print readtimeNumbersortlist1.append(readtimeNumber)  #time.sleep(2)aa['indexs']=readtimeNumber  aa['content']=content.text.strip()  aa['read_time']=readtime   aa['contemtUrl']=contemtUrl  sortlist.append(aa)  		sortlist1.sort()  print sortlist1  for i in sortlist1:  for a in sortlist:  if int(i) == int(a['indexs']):  totalcontent=a['content']+'\t'+a['read_time']+'\t'+a['contemtUrl']  print totalcontent  fd.write(totalcontent)  fd.write('\n')urlList.append(a['contemtUrl'])contentList.append(totalcontent)  fd.close()  return urlList  urls=getPage()

 

第五版

这次版本对整个函数进行了调整

1.让每一部分看起来更易读

2.可以统计个人名下所有的博客内容了,不管你有多少篇多少页博客,都能给统计到

3.更新了排序算法,这样就修复了之前的一个bug

 

代码如下:

 

#coding:utf-8
import urllib2,re,time,random,os,datetime
from bs4 import BeautifulSoup
import webbrowser as web
import sys
reload(sys)  
sys.setdefaultencoding('utf-8')#自定义打印函数
def self_log(msg):print u'%s: %s' % (time.strftime('%Y-%m-%d %H:%M:%S'), msg)#获取页面内容
def  get_html(url):headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}req = urllib2.Request(url=url,headers=headers)try:html = urllib2.urlopen(req).read()except urllib2.HTTPError,e:print e.codereturn html#得到博客页面总数
def get_last_page(html,fd):if not html:self_log(u'页面错误,停止运行') returnpage = BeautifulSoup(html,'lxml')if page.find('div',class_ ='pagelist').find_all('a'):last_page=page.find('div',class_ ='pagelist').find_all('a')last_page= last_page[len(last_page)-1].get('href')[-1:]self_log('总共有%s 页博客' % last_page)fd.write('总共有%s 页博客\n' % last_page)return last_pageelse:return 1#获取积分内容		
def get_rank(html,fd):if not html:self_log(u'页面错误,停止运行') returnpage = BeautifulSoup(html,'lxml')rank_list=[]if page.find(id='blog_rank'):rank_content=page.find(id='blog_rank')i =1for rank in rank_content.find_all('li'):if i<3:self_log(rank.text)fd.write(rank.text)fd.write('\n')rank_list.append(rank.text)i +=1return rank_list#获取页面列表
def get_items(url):content_html=get_html(url)page = BeautifulSoup(content_html,'lxml')items = page.find_all('div',class_ ='list_item list_view')return items#根据每一个items list 提取需要的元素
def handle_items(items,content_list,read_num_for_sort):for item in items:temp={}#临时变量title=item.find('a')#标题content_url='http://blog.csdn.net'+title.get('href')#标题对应文章的地址read_times=item.find('span',class_ ='link_view').text.strip()#阅读次数comments_time=item.find('span',class_ ='link_comments')#评论次数read_number = int(filter(str.isdigit, str(read_times)))	#提取出来具体阅读次数的数字,为之后的排序做准备read_num_for_sort.append(read_number)#将数据打包temp['indexs']=read_numbertemp['title']=title.text.strip()temp['read_times']=read_timestemp['comments_time']=comments_time.text.strip()temp['content_url']=content_urlcontent_list.append(temp)#创建文件夹
def mkdir_folder(path):if not os.path.exists(path):  os.makedirs(path) #程序运行主函数		
def run(url):read_num_for_sort=[]content_list=[]content_totle_list=[]#定义文件夹名字并创建文件夹dir_path='count'mkdir_folder(dir_path)#定义文件名字count_file_name=dir_path+'/'+datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')+'.txt'fd=open(count_file_name,'w')#1.从主页进入获取页面总数main_html=get_html(url)last_page=get_last_page(main_html,fd)#2.获取积分内容rank_list=get_rank(main_html,fd)#3.组装url,分别加载每页的页面,同时在每一个页面提取我们需要的内容for i in range(1,int(last_page)+1):main_url=url.split('?')[0]+'/article/list/%d?viewmode=contents' % iself_log('即将获取第%d页的内容,地址是:%s' % (i,main_url))items=get_items(main_url)#获取每一页的页面内容,根据页面内容得到文章item listhandle_items(items,content_list,read_num_for_sort)#处理item list#4.根据阅读次数 进行排序read_num_for_sort.sort()print read_num_for_sort'''这也是一种排序思想,其中有一些缺陷for i in read_num_for_sort:for a in content_list:if int(i) == int(a['indexs']):totalcontent=a['content']+'\t|'+a['read_time']+'\t|'+a['comments_time']+'\t|'+a['contemtUrl']'''self_log('总共有%d 篇文章' % len(content_list))#根据得到的数据,统计文章总数content_list = sorted(content_list,cmp=lambda x,y:cmp(x['indexs'],y['indexs']),reverse=0)#根据 indexs(阅读次数)这个索引值进行排序article_index = 1for a in content_list:#组装打印语句totalcontent= '第'+str(article_index)+'篇  |'+a['title']+'\t|'+a['read_times']+'\t|'+a['comments_time']+'\t|'+a['content_url']self_log(totalcontent)#将其存贮到本地fd.write(totalcontent)fd.write('\n')article_index +=1content_totle_list.append(totalcontent)fd.close()		return content_totle_listif __name__ == '__main__': print '''' ***************************************** **    Welcome to Spider of Count CSDN  ** **      Created on 2017-04-12          ** **      @author: Jimy_Fengqi           ** *****************************************'''  url='http://blog.csdn.net/qiqiyingse?viewmode=contents'run(url)

第六版

此次更新,优化一点点内容

主要是可以将文章内容存贮到本地

同时,将统计信息重新放到一个excel 里面

代码如下:

 

#coding:utf-8
import urllib2,re,time,random,os,datetime
from bs4 import BeautifulSoup
from pyExcelerator import * #导入excel相关包 
import sys
reload(sys)  
sys.setdefaultencoding('utf-8')#自定义打印函数
def self_log(msg):print u'%s: %s' % (time.strftime('%Y-%m-%d %H:%M:%S'), msg)#获取页面内容
def  get_html(url):headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}req = urllib2.Request(url=url,headers=headers)try:html = urllib2.urlopen(req).read()except urllib2.HTTPError,e:print e.codereturn html#得到博客页面总数
def get_last_page(html,fd):if not html:self_log(u'页面错误,停止运行') returnpage = BeautifulSoup(html,'lxml')if page.find('div',class_ ='pagelist').find_all('a'):last_page=page.find('div',class_ ='pagelist').find_all('a')last_page= last_page[len(last_page)-1].get('href')[-1:]self_log('总共有%s 页博客' % last_page)fd.write('总共有%s 页博客\n' % last_page)return last_pageelse:return 1#获取积分内容		
def get_rank(html,fd):if not html:self_log(u'页面错误,停止运行') returnpage = BeautifulSoup(html,'lxml')rank_list=[]if page.find(id='blog_rank'):rank_content=page.find(id='blog_rank')i =1for rank in rank_content.find_all('li'):if i<3:self_log(rank.text)fd.write(rank.text)fd.write('\n')rank_list.append(rank.text)i +=1return rank_list#获取页面列表
def get_items(url):content_html=get_html(url)page = BeautifulSoup(content_html,'lxml')items = page.find_all('div',class_ ='list_item list_view')return items#根据每一个items list 提取需要的元素
def handle_items(items,content_list,read_num_for_sort):for item in items:temp={}#临时变量title=item.find('a')#标题content_url='http://blog.csdn.net'+title.get('href')#标题对应文章的地址read_times=item.find('span',class_ ='link_view').text.strip()#阅读次数comments_time=item.find('span',class_ ='link_comments')#评论次数read_number = int(filter(str.isdigit, str(read_times)))	#提取出来具体阅读次数的数字,为之后的排序做准备read_num_for_sort.append(read_number)#将数据打包temp['indexs']=read_numbertemp['title']=title.text.strip()temp['read_times']=read_timestemp['comments_time']=comments_time.text.strip()temp['content_url']=content_urlcontent_list.append(temp)#创建文件夹
def mkdir_folder(path):if not os.path.exists(path):  os.makedirs(path) #获取页面信息
def getContent(html):page = BeautifulSoup(html,'lxml')try:title=page.find('div',class_='article_title').find('a').texttitle=title.strip()except Exception,e:print etry:content=page.find('div',class_='article_content')dir_path='count'artitle_name_path=dir_path+'/'+title+'.txt'with open(artitle_name_path+'.txt','w') as f:f.write(content.text)self_log(u'存贮文章:%s 完毕' % title)except Exception,e:print e#存贮每一篇文章到本地
def run_to_get_article(content_total_list):self_log('start save every article  ')for article_content in content_total_list:article_url=article_content.split('|')[4]self_log( '将要存贮的地址是: %s ...' % article_url)artitle_html=get_html(article_url)getContent(artitle_html)#将内容存贮到excel中	
def run_to_save_info_in_excel(content_total_list):self_log('start save info into excel')excel_w=Workbook()excel_sheet_name=time.strftime('%Y-%m-%d_%H-%M-%S')excel_content_handler=excel_w.add_sheet(excel_sheet_name) first_line=[u'编号',u'标题',u'阅读次数',u'评论次数',u'文章地址']cols=0for content in first_line:excel_content_handler.write(0,cols,content)cols +=1index=1for article_content in content_total_list:cols =0for a in article_content.split('|'):excel_content_handler.write(index,cols,a)cols +=1index +=1excel_w.save('count/'+'count'+time.strftime('%Y-%m-%d')+'.xls')#程序运行主函数		
def run(url):read_num_for_sort=[]content_list=[]content_total_list=[]#定义文件夹名字并创建文件夹dir_path='count'mkdir_folder(dir_path)#定义文件名字count_file_name=dir_path+'/'+datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')+'.txt'fd=open(count_file_name,'w')#1.从主页进入获取页面总数main_html=get_html(url)last_page=get_last_page(main_html,fd)#2.获取积分内容rank_list=get_rank(main_html,fd)#3.组装url,分别加载每页的页面,同时在每一个页面提取我们需要的内容for i in range(1,int(last_page)+1):main_url=url.split('?')[0]+'/article/list/%d?viewmode=contents' % iself_log('即将获取第%d页的内容,地址是:%s' % (i,main_url))items=get_items(main_url)#获取每一页的页面内容,根据页面内容得到文章item listhandle_items(items,content_list,read_num_for_sort)#处理item list#4.根据阅读次数 进行排序read_num_for_sort.sort()print read_num_for_sort'''这也是一种排序思想,其中有一些缺陷for i in read_num_for_sort:for a in content_list:if int(i) == int(a['indexs']):totalcontent=a['content']+'\t|'+a['read_time']+'\t|'+a['comments_time']+'\t|'+a['contemtUrl']'''self_log('总共有%d 篇文章' % len(content_list))#根据得到的数据,统计文章总数#根据 indexs(阅读次数)这个索引值进行排序#非常好的一个根据列表中字典数据进行排序的方法content_list = sorted(content_list,cmp=lambda x,y:cmp(x['indexs'],y['indexs']),reverse=0)article_index = 1for a in content_list:#组装打印语句totalcontent= '第'+str(article_index)+'篇  |'+a['title']+'\t|'+a['read_times']+'\t|'+a['comments_time']+'\t|'+a['content_url']#self_log(totalcontent)#将其存贮到本地fd.write(totalcontent)fd.write('\n')article_index +=1content_total_list.append(totalcontent)fd.close()		return content_total_listif __name__ == '__main__': print '''' ***************************************** **    Welcome to Spider of Count CSDN  ** **      Created on 2017-04-12          ** **      @author: Jimy_Fengqi           ** *****************************************''' url=raw_input(u'请输入将要统计的个人csdn主页地址,类似如下:\n http://blog.csdn.net/qiqiyingse?viewmode=contents')if not url:url='http://blog.csdn.net/qiqiyingse?viewmode=contents'content_total_list=run(url)run_to_save_info_in_excel(content_total_list)run_to_get_article(content_total_list)

 

 

 

第七版

更新一下excel 的使用方法

 

#coding:utf-8
import urllib2,re,time,random,os,datetime
from bs4 import BeautifulSoup
from pyExcelerator import * #导入excel相关包 
import xlrd 
import xlwt
from xlutils.copy import copy
import sys
reload(sys)  
sys.setdefaultencoding('utf-8')def create_excel(data):excle_file_name=str(time.strftime('%Y-%m-%d')+'.xls')#以当天日期创建excel表#判断一个文件是否存在	def file_is_exist(file_name):path = os.path.join(os.getcwd()+'/count/'+file_name)print 'current file [%s] path is [%s]' % (file_name,path)is_exists = os.path.exists(path)return is_exists#读取复制一份,并且增加一张新表	def read_and_copy_excle(excle_file_name):read_excel_flag=xlrd.open_workbook(excle_file_name,formatting_info=True)#保存原有格式count = len(read_excel_flag.sheets()) #sheet数量for r in read_excel_flag.sheets():print r.name #sheet名称worksheet_copy=copy(read_excel_flag)#复制一份excelwrite_excel(worksheet_copy,excle_file_name)#之后再次插入一份#写exceldef write_excel(excel_flag,excle_file_name):sheet_name=str(time.strftime('%Y-%m-%d_%H-%M-%S'))sheet_flag = excel_flag.add_sheet(sheet_name,cell_overwrite_ok=True) #创建sheetfirst_line=[u'编号',u'标题',u'阅读次数',u'评论次数',u'文章地址']#生成第一行for i in range(0,len(first_line)):sheet_flag.write(0,i,first_line[i],set_style('Times New Roman',220,True,40))if i== 1:#设置行宽sheet_flag.col(i).width=256*150elif i == 4:sheet_flag.col(i).width=256*80else:sheet_flag.col(i).width=256*15row_index=1	for article_content in data:cols_index =0for data_detail in article_content.split('|'):sheet_flag.write(row_index,cols_index,data_detail,set_style('Arial',300,False,cols_index))#sheet_flag.col(cols_index).width=sheet_flag.col(cols_index+1).widthcols_index +=1row_index +=1style = xlwt.easyxf('font:height 240, color-index red, bold on;align: wrap on, vert centre, horiz center');  sheet_flag.write(row_index+1,cols_index+1, 'hello world', style) sheet_flag.write(row_index+2,cols_index+2,'start',set_style(u'宋体',300,False,20))excel_flag.save('count/'+excle_file_name) #保存文件#设置单元格格式def set_style(name,height,bold,color_index):style = xlwt.XFStyle() # 初始化样式font = xlwt.Font() # 为样式创建字体font.name = name # 字体名称font.bold = bold #字体加粗font.color_index = color_index #字体颜色, 但是貌似无效font.height = heightborders= xlwt.Borders()#字体边框borders.left= 6borders.right= 6borders.top= 6borders.bottom= 6style.font = fontif bold:style.borders = bordersreturn style#文件存在就复制一份,并在其表的后面插入一个,不存在就新创建一个if file_is_exist(excle_file_name):print 'file 【%s】 exist ' % excle_file_nameread_and_copy_excle(excle_file_name)#复制一个excle并追加一个sheet页else:print 'file 【%s】is not  exist, will create it ' % excle_file_nameexcel_flag=xlwt.Workbook()#新建excel工作薄write_excel(excel_flag,excle_file_name)#自定义打印函数
def self_log(msg):print u'%s: %s' % (time.strftime('%Y-%m-%d %H:%M:%S'), msg)#获取页面内容
def  get_html(url):headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}req = urllib2.Request(url=url,headers=headers)try:html = urllib2.urlopen(req).read()except urllib2.HTTPError,e:print e.codereturn html#得到博客页面总数
def get_last_page(html,fd):if not html:self_log(u'页面错误,停止运行') returnpage = BeautifulSoup(html,'lxml')if page.find('div',class_ ='pagelist').find_all('a'):last_page=page.find('div',class_ ='pagelist').find_all('a')last_page= last_page[len(last_page)-1].get('href')[-1:]self_log('总共有%s 页博客' % last_page)fd.write('总共有%s 页博客\n' % last_page)return last_pageelse:return 1#获取积分内容		
def get_rank(html,fd):if not html:self_log(u'页面错误,停止运行') returnpage = BeautifulSoup(html,'lxml')rank_list=[]if page.find(id='blog_rank'):rank_content=page.find(id='blog_rank')i =1for rank in rank_content.find_all('li'):if i<3:self_log(rank.text)fd.write(rank.text)fd.write('\n')rank_list.append(rank.text)i +=1return rank_list#获取页面列表
def get_items(url):content_html=get_html(url)page = BeautifulSoup(content_html,'lxml')items = page.find_all('div',class_ ='list_item list_view')return items#根据每一个items list 提取需要的元素
def handle_items(items,content_list,read_num_for_sort):for item in items:temp={}#临时变量title=item.find('a')#标题content_url='http://blog.csdn.net'+title.get('href')#标题对应文章的地址read_times=item.find('span',class_ ='link_view').text.strip()#阅读次数comments_time=item.find('span',class_ ='link_comments')#评论次数read_number = int(filter(str.isdigit, str(read_times)))	#提取出来具体阅读次数的数字,为之后的排序做准备read_num_for_sort.append(read_number)#将数据打包temp['indexs']=read_numbertemp['title']=title.text.strip()temp['read_times']=read_timestemp['comments_time']=comments_time.text.strip()temp['content_url']=content_urlcontent_list.append(temp)#创建文件夹
def mkdir_folder(path):if not os.path.exists(path):  os.makedirs(path) #获取页面信息
def getContent(html):page = BeautifulSoup(html,'lxml')try:title=page.find('div',class_='article_title').find('a').texttitle=title.strip()except Exception,e:print etry:content=page.find('div',class_='article_content')dir_path='count'artitle_name_path=dir_path+'/'+title+'.txt'with open(artitle_name_path+'.txt','w') as f:f.write(content.text)self_log(u'存贮文章:%s 完毕' % title)except Exception,e:print e#存贮每一篇文章到本地
def run_to_get_article(content_total_list):self_log('start save every article  ')for article_content in content_total_list:article_url=article_content.split('|')[4]self_log( '将要存贮的地址是: %s ...' % article_url)artitle_html=get_html(article_url)getContent(artitle_html)#将内容存贮到excel中	
def run_to_save_info_in_excel(content_total_list):self_log('start save info into excel')excel_w=Workbook()excel_sheet_name=time.strftime('%Y-%m-%d_%H-%M-%S')excel_content_handler=excel_w.add_sheet(excel_sheet_name) first_line=[u'编号',u'标题',u'阅读次数',u'评论次数',u'文章地址']cols=0for content in first_line:excel_content_handler.write(0,cols,content)cols +=1index=1for article_content in content_total_list:cols =0for a in article_content.split('|'):excel_content_handler.write(index,cols,a)cols +=1index +=1excel_w.save('count/'+'count_'+time.strftime('%Y-%m-%d_%H-%M')+'.xls')#程序运行主函数		
def run(url):read_num_for_sort=[]content_list=[]content_total_list=[]#定义文件夹名字并创建文件夹dir_path='count'mkdir_folder(dir_path)#定义文件名字count_file_name=dir_path+'/'+datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')+'.txt'fd=open(count_file_name,'w')#1.从主页进入获取页面总数main_html=get_html(url)last_page=get_last_page(main_html,fd)#2.获取积分内容rank_list=get_rank(main_html,fd)#3.组装url,分别加载每页的页面,同时在每一个页面提取我们需要的内容for i in range(1,int(last_page)+1):main_url=url.split('?')[0]+'/article/list/%d?viewmode=contents' % iself_log('即将获取第%d页的内容,地址是:%s' % (i,main_url))items=get_items(main_url)#获取每一页的页面内容,根据页面内容得到文章item listhandle_items(items,content_list,read_num_for_sort)#处理item list#4.根据阅读次数 进行排序read_num_for_sort.sort()print read_num_for_sort'''这也是一种排序思想,其中有一些缺陷for i in read_num_for_sort:for a in content_list:if int(i) == int(a['indexs']):totalcontent=a['content']+'\t|'+a['read_time']+'\t|'+a['comments_time']+'\t|'+a['contemtUrl']'''self_log('总共有%d 篇文章' % len(content_list))#根据得到的数据,统计文章总数#根据 indexs(阅读次数)这个索引值进行排序#非常好的一个根据列表中字典数据进行排序的方法content_list = sorted(content_list,cmp=lambda x,y:cmp(x['indexs'],y['indexs']),reverse=0)article_index = 1for a in content_list:#组装打印语句totalcontent= '第'+str(article_index)+'篇|'+a['title']+'|'+a['read_times']+'|'+a['comments_time']+'|'+a['content_url']#self_log(totalcontent)print totalcontent#将其存贮到本地fd.write(totalcontent)fd.write('\n')article_index +=1content_total_list.append(totalcontent)fd.close()		return content_total_listif __name__ == '__main__': print '''' ***************************************** **    Welcome to Spider of Count CSDN  ** **      Created on 2017-04-12          ** **      @author: Jimy_Fengqi           ** *****************************************''' url=raw_input(u'请输入将要统计的个人csdn主页地址,类似如下:\n http://blog.csdn.net/qiqiyingse?viewmode=contents')if not url:url='http://blog.csdn.net/qiqiyingse?viewmode=contents'content_total_list=run(url)#run_to_save_info_in_excel(content_total_list)create_excel(content_total_list)#run_to_get_article(content_total_list)

第八版

这个版本是在python3上面跑的,同时更新了一些细节

将爬取数据模块,处理模块都分开了

# -*- coding: utf-8 -*-
# @Date    : 2018-08-20 13:48:04
# @Author  : Jimy_Fengqi (jmps515@163.com)
# @Link    : https://blog.csdn.net/qiqiyingse/
# @Version : v1.0import sys
import os
import time 
import re
import json
from xlwt import Workbookfrom pyquery import PyQuery as pqfrom functools import cmp_to_key
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options#自定义log函数,主要是加上时间
def logger(msg):print ('%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg))class CSDNSpider():def __init__(self):#自己博客主页self.csdn_url = 'http://blog.csdn.net/qiqiyingse?viewmode=contents'self.page_base_url="http://blog.csdn.net/qiqiyingse/article/list/"self.contentList=[]self.contentLists=[]# 爬虫伪装头部设置self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}# 设置操作超时时长self.timeout = 5# 爬虫模拟在一个request.session中完成self.mySession = requests.Session()self.phantomjs_path=r'C:\Users\Administrator\AppData\Local\Programs\Python\Python36\selenium\phantomjs-2.1.1-windows\bin\phantomjs.exe'self.chromedriver_path=	r'C:\Users\Administrator\AppData\Local\Programs\Python\Python36\selenium\chromedriver.exe'self.mylisttest=[{'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81980458', 'acticle_title': '转 python 获取操作系统信息或者用户名', 'read_num': 20, 'index': 1}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81776735', 'acticle_title': '原 NodeJS学习(2)构建第一个爬虫', 'read_num': 49, 'index': 2}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81668517', 'acticle_title': '转 Python Webdriver 重新使用已经打开的浏览器实例', 'read_num': 55, 'index': 3}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81281658', 'acticle_title': '原 python 小工具--像打字机一样输出内容', 'read_num': 55, 'index': 4}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81567080', 'acticle_title': '原 python实现屏幕录制', 'read_num': 64, 'index': 5}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81565263', 'acticle_title': '转 解决Python读取文件时出现编码异常', 'read_num': 67, 'index': 6}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/79442645', 'acticle_title': '转 安装scrapy报错 Python.h: 没有那个文件或目录', 'read_num': 97, 'index': 7}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/80269610', 'acticle_title': '原 Android 编译,烧机的一些方法', 'read_num': 108, 'index': 8}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/81668345', 'acticle_title': '原 python实现实时电脑监控', 'read_num': 113, 'index': 9}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/79473830', 'acticle_title': '转 GitHub上README.md教程', 'read_num': 121, 'index': 10}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/78141474', 'acticle_title': '转 设计模式(七)策略模式详解', 'read_num': 189, 'index': 11}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/78141487', 'acticle_title': '转 设计模式(八)适配器模式详解', 'read_num': 210, 'index': 12}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/79471056', 'acticle_title': '原 使用 Python时常用的安装包', 'read_num': 221, 'index': 13}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/77855473', 'acticle_title': '原 python实现的一种排序方法', 'read_num': 221, 'index': 14}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/79471634', 'acticle_title': '转 微信小程序集合', 'read_num': 249, 'index': 15}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71543110', 'acticle_title': '原 Mongodb学习(2)概念学习——ACID原则', 'read_num': 365, 'index': 16}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/74004388', 'acticle_title': '转 设计模式(五)抽象工厂模式详解', 'read_num': 367, 'index': 17}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72540866', 'acticle_title': '原 python学习——邮件发送程序', 'read_num': 370, 'index': 18}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/78210646', 'acticle_title': '原 python 实现文件查找功能', 'read_num': 400, 'index': 19}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71544282', 'acticle_title': '原 Mongodb学习(2)概念学习——基本内容', 'read_num': 411, 'index': 20}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72961382', 'acticle_title': '原 redis学习(1)python连接redis', 'read_num': 454, 'index': 21}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72453537', 'acticle_title': '原 Mongodb学习(5)pymongdb的使用', 'read_num': 471, 'index': 22}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71643828', 'acticle_title': '原 Python挑战游戏汇总', 'read_num': 485, 'index': 23}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/78132072', 'acticle_title': '转 用Python实现一个简单的文件传输协议', 'read_num': 486, 'index': 24}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71647261', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level 0', 'read_num': 490, 'index': 25}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/77747777', 'acticle_title': '转 python数据持久存储:pickle模块的基本使用', 'read_num': 507, 'index': 26}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/77835705', 'acticle_title': '原 Mongodb学习(10)一个小例子', 'read_num': 520, 'index': 27}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72566001', 'acticle_title': '原 Mongodb学习(6)pymongdb的数据库的拷贝', 'read_num': 542, 'index': 28}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72898831', 'acticle_title': '原 Node.js学习(1)牛刀小试', 'read_num': 568, 'index': 29}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/77745548', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level- 5', 'read_num': 572, 'index': 30}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72558839', 'acticle_title': '原 pythonUI学习实践(1)制作自己的闹钟', 'read_num': 575, 'index': 31}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71514942', 'acticle_title': '原 Mongodb学习(1)安装以及配置', 'read_num': 577, 'index': 32}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71757964', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level- 3', 'read_num': 598, 'index': 33}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/74004472', 'acticle_title': '转 设计模式(六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)', 'read_num': 609, 'index': 34}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71580496', 'acticle_title': '转 设计模式(四)工厂方法模式详解(另附简单工厂的死亡之路)', 'read_num': 614, 'index': 35}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71756381', 'acticle_title': '原 python练习题——string模块', 'read_num': 622, 'index': 36}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72953832', 'acticle_title': '原 Mongodb学习(9)集群搭建以及错误处理', 'read_num': 637, 'index': 37}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72633533', 'acticle_title': '原 Mongodb学习(7)pymongdb的使用——打印数据库名和table名', 'read_num': 734, 'index': 38}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71226818', 'acticle_title': '转 设计模式详解(总纲)', 'read_num': 777, 'index': 39}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71747671', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level- 2', 'read_num': 835, 'index': 40}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71547716', 'acticle_title': '原 Mongodb学习(3)基本操作——增删改查', 'read_num': 855, 'index': 41}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71678011', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level- 1', 'read_num': 859, 'index': 42}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/78225394', 'acticle_title': '原 Python 实现替换文件里面的内容', 'read_num': 898, 'index': 43}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/77749109', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level- 6', 'read_num': 926, 'index': 44}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71232015', 'acticle_title': '原 使用python一键登录博客', 'read_num': 1033, 'index': 45}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72553276', 'acticle_title': '转 Python图像处理库PIL的ImageFilter模块介绍', 'read_num': 1072, 'index': 46}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71216102', 'acticle_title': '原 python excel使用进阶篇', 'read_num': 1128, 'index': 47}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/79487514', 'acticle_title': '原 linux环境 安装chromedriver 和 phantomjs的方法', 'read_num': 1179, 'index': 48}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72285927', 'acticle_title': '原 Python挑战游戏( PythonChallenge)闯关之路Level- 4', 'read_num': 1251, 'index': 49}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71405436', 'acticle_title': '转 python 的日志logging模块学习', 'read_num': 1323, 'index': 50}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71218711', 'acticle_title': '原 在python上使用wordcloud制作自己的词云', 'read_num': 1515, 'index': 51}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71172347', 'acticle_title': '原 使用python装饰器计算函数运行时间', 'read_num': 1519, 'index': 52}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72553279', 'acticle_title': '原 python技巧——自己做验证码', 'read_num': 1525, 'index': 53}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71123322', 'acticle_title': '转 Python下调用Linux的Shell命令', 'read_num': 2118, 'index': 54}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/78501034', 'acticle_title': '原 python爬虫(19)爬取论坛网站——网络上常见的gif动态图', 'read_num': 2199, 'index': 55}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/72633711', 'acticle_title': '原 Mongodb学习(8)pymongdb的使用——数据去重', 'read_num': 2584, 'index': 56}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71640203', 'acticle_title': '原 python爬虫(10)身边的翻译专家——获取有道翻译结果', 'read_num': 2600, 'index': 57}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59483706', 'acticle_title': '原 08_python_练习题——乘法表', 'read_num': 2912, 'index': 58}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59488018', 'acticle_title': '原 python——利用python通过浏览器打开博客页面', 'read_num': 2987, 'index': 59}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71227451', 'acticle_title': '转 (一)单例模式详解', 'read_num': 2994, 'index': 60}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70048820', 'acticle_title': '转 Python中PyQuery库的使用总结', 'read_num': 3007, 'index': 61}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71122905', 'acticle_title': '原 python小工具——下载更新代码工具', 'read_num': 3035, 'index': 62}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59112217', 'acticle_title': '原 01_python_练习题_使用python直接打开网页', 'read_num': 3053, 'index': 63}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59483629', 'acticle_title': '原 07_python_练习题——数值排序', 'read_num': 3063, 'index': 64}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70143777', 'acticle_title': '原 17_python_练习题——打印指定目录下的文件和文件夹(相当于tree命令)', 'read_num': 3078, 'index': 65}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60132246', 'acticle_title': '转 [Python] xrange和range的使用区别', 'read_num': 3090, 'index': 66}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60144027', 'acticle_title': '原 13_python_练习题——文件重定向', 'read_num': 3098, 'index': 67}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/67641261', 'acticle_title': '原 12_python爬虫——下载个人CSDN博客内容', 'read_num': 3102, 'index': 68}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59112479', 'acticle_title': '原 02_python_练习题——图形界面', 'read_num': 3142, 'index': 69}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60582816', 'acticle_title': '原 python爬虫(5)黑板客第三关', 'read_num': 3168, 'index': 70}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59481693', 'acticle_title': '原 05_python_练习题——平方数', 'read_num': 3169, 'index': 71}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60129630', 'acticle_title': '原 12_python_练习题——统计输入字符里面有多少', 'read_num': 3209, 'index': 72}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/55260352', 'acticle_title': '原 Python的安装', 'read_num': 3213, 'index': 73}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/55517278', 'acticle_title': '转 python version 2.7 required,which was not found in the registry', 'read_num': 3274, 'index': 74}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62427733', 'acticle_title': '原 15_python_练习题——使用webdriver查询IP地址', 'read_num': 3290, 'index': 75}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60582751', 'acticle_title': '原 15_python_练习题——打印日历', 'read_num': 3329, 'index': 76}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/61197123', 'acticle_title': '原 统计个人CSDN的博客文章数量', 'read_num': 3340, 'index': 77}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60572338', 'acticle_title': '原 python爬虫(4)四种方法通过黑板客第二关', 'read_num': 3350, 'index': 78}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70208940', 'acticle_title': '原 19_python_练习题——CSV文件读写练习', 'read_num': 3375, 'index': 79}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70172218', 'acticle_title': '原 18_python_练习题——写入文件到word文档中', 'read_num': 3378, 'index': 80}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/64522690', 'acticle_title': '原 python爬虫(7)爬取糗事百科段子(UI版)', 'read_num': 3378, 'index': 81}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70125444', 'acticle_title': '转 linux后台运行和关闭、查看后台任务', 'read_num': 3406, 'index': 82}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70145804', 'acticle_title': '转 SSH 的详细使用方法', 'read_num': 3434, 'index': 83}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70855457', 'acticle_title': '转 python的一个好玩模块wordcloud', 'read_num': 3438, 'index': 84}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70843626', 'acticle_title': '转 shell脚本:Syntax error: Bad for loop variable错误解决方法', 'read_num': 3439, 'index': 85}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/55259304', 'acticle_title': '原 py2exe的使用', 'read_num': 3487, 'index': 86}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70161637', 'acticle_title': '转 卸载win10 自带应用', 'read_num': 3514, 'index': 87}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/68926007', 'acticle_title': '原 python——一个投票器', 'read_num': 3514, 'index': 88}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59113090', 'acticle_title': '原 04_python_练习题——企业利润', 'read_num': 3533, 'index': 89}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70138912', 'acticle_title': '转 Python爬虫防封杀方法集合', 'read_num': 3639, 'index': 90}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60144578', 'acticle_title': '原 python爬虫(3)五种方法通过黑板客第一关', 'read_num': 3826, 'index': 91}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71131120', 'acticle_title': '原 将python代码和注释分离', 'read_num': 3998, 'index': 92}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71308389', 'acticle_title': '转 (二)代理模式详解(包含原理详解)', 'read_num': 4186, 'index': 93}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71344110', 'acticle_title': '转 (三)简单工厂模式详解', 'read_num': 4198, 'index': 94}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62427155', 'acticle_title': '原 python爬虫(14)获取淘宝MM个人信息及照片(上)', 'read_num': 4217, 'index': 95}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62896264', 'acticle_title': '原 16_python_练习题——使用webdriver获取当前页面截屏以及滑动页面', 'read_num': 4311, 'index': 96}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/69944173', 'acticle_title': '原 将自己的python程序打包成exe', 'read_num': 4478, 'index': 97}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71616418', 'acticle_title': '原 Mongodb学习(4)通过配置文件启动mongod', 'read_num': 4503, 'index': 98}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/46800751', 'acticle_title': '原 几行代码解决大端小端的问题', 'read_num': 4725, 'index': 99}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60583419', 'acticle_title': '原 14_python_练习题——excel操作', 'read_num': 4890, 'index': 100}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70046543', 'acticle_title': '原 quote函数什么意思,怎么用', 'read_num': 4936, 'index': 101}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71123348', 'acticle_title': '转 黄聪:Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等 )', 'read_num': 4957, 'index': 102}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62236845', 'acticle_title': '原 python爬虫(12)获取七天内的天气', 'read_num': 5102, 'index': 103}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59526995', 'acticle_title': '原 11_python_练习题——日期格式显示', 'read_num': 5301, 'index': 104}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70855068', 'acticle_title': '转 抓取网易云音乐歌曲 热门评论生成词云(转)', 'read_num': 5312, 'index': 105}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71325615', 'acticle_title': '原 python_随机调用一个浏览器打开网页', 'read_num': 5543, 'index': 106}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70049591', 'acticle_title': '原 json.dumps和 json.loads 区别,如此简单', 'read_num': 5649, 'index': 107}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59502402', 'acticle_title': '原 10_python_练习题——兔子问题与斐波那契數列', 'read_num': 5831, 'index': 108}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59483966', 'acticle_title': '原 09_python_练习题——暂停一秒', 'read_num': 5879, 'index': 109}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59483536', 'acticle_title': '原 06_python_练习题——查找一年之中第几天', 'read_num': 5930, 'index': 110}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/59112715', 'acticle_title': '原 03_python_练习题——排列组合', 'read_num': 5949, 'index': 111}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62231679', 'acticle_title': '原 python爬虫(8)爬取tuchong网站美图', 'read_num': 6060, 'index': 112}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/68944885', 'acticle_title': '原 python爬虫——爬取链家房价信息(未完待续)', 'read_num': 6185, 'index': 113}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70209450', 'acticle_title': '原 python使用代理访问网站', 'read_num': 6193, 'index': 114}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71168993', 'acticle_title': '转 webdriver+selenium面试总结', 'read_num': 6374, 'index': 115}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/68061256', 'acticle_title': '原 02_python安装错误——2502、2503错误', 'read_num': 6483, 'index': 116}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71123066', 'acticle_title': '原 python——接收处理外带的参数', 'read_num': 7459, 'index': 117}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/68496603', 'acticle_title': '转 Python面试必须要看的15个问题', 'read_num': 7477, 'index': 118}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70175619', 'acticle_title': '原 python爬虫(13)爬取百度贴吧帖子', 'read_num': 7619, 'index': 119}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70766993', 'acticle_title': '原 python_获取当前代码行号_获取当前运行的类名和函数名的方法', 'read_num': 7645, 'index': 120}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71173514', 'acticle_title': '原 python爬虫(11)身边的搜索专家——获取百度搜索结果', 'read_num': 7770, 'index': 121}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70674353', 'acticle_title': '原 python_制作自己的函数库', 'read_num': 7908, 'index': 122}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62985485', 'acticle_title': '原 python爬虫(14)获取淘宝MM个人信息及照片(下)(windows版本)', 'read_num': 7990, 'index': 123}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71326756', 'acticle_title': '原 使用notepad++开发python的配置——代码缩进、自动补齐、运行', 'read_num': 8389, 'index': 124}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60583129', 'acticle_title': '原 python爬虫(6)爬取糗事百科', 'read_num': 8788, 'index': 125}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71081165', 'acticle_title': '转 python安装scipy 遇到的问题', 'read_num': 9595, 'index': 126}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70766654', 'acticle_title': '转 python_python中try except处理程序异常的三种常用方法', 'read_num': 9897, 'index': 127}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70843655', 'acticle_title': '转 shell for循环1到100', 'read_num': 10421, 'index': 128}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/60146843', 'acticle_title': "原 python编译错误(1)字符编码问题UnicodeDecodeError: 'ascii' codec", 'read_num': 10838, 'index': 129}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62894826', 'acticle_title': '原 python爬虫(14)获取淘宝MM个人信息及照片(中)', 'read_num': 11136, 'index': 130}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/62418857', 'acticle_title': '原 python爬虫(9)获取动态搞笑图片', 'read_num': 11543, 'index': 131}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/51801918', 'acticle_title': '原 python爬虫(2)爬取游民星空网的图片', 'read_num': 13661, 'index': 132}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71082263', 'acticle_title': '原 python爬虫(20)使用真实浏览器打开网页的两种方法', 'read_num': 16160, 'index': 133}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/51879501', 'acticle_title': '原 python爬虫(1)下载任意网页图片', 'read_num': 16323, 'index': 134}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/51798833', 'acticle_title': '原 python爬虫(15)爬取百度百科字条_精品', 'read_num': 17306, 'index': 135}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/65631698', 'acticle_title': '原 python爬虫(16)使用scrapy框架爬取顶点小说网', 'read_num': 17652, 'index': 136}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/46800537', 'acticle_title': '原 C语言常见面试题(经典中的经典)', 'read_num': 19962, 'index': 137}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/71126591', 'acticle_title': '原 python爬虫(18)爬取微信公众号内容——绘制词云', 'read_num': 20565, 'index': 138}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70160059', 'acticle_title': '原 python爬虫(17)爬出新高度_抓取微信公众号文章(selenium+phantomjs)(下)(windows版本)', 'read_num': 22474, 'index': 139}, {'new_acrticle_url': 'https://blog.csdn.net/qiqiyingse/article/details/70050113', 'acticle_title': '原 python爬虫(17)爬出新高度_抓取微信公众号文章(selenium+phantomjs)(上)', 'read_num': 32994, 'index': 140}]def get_html_by_request(self,url):logger(u'开始使用 request 获取的网页为:%s' %  url)try:html = self.mySession.get(url, headers=self.headers, timeout=self.timeout)return html.contentexcept Exception as e:logger(e)	def get_selenium_js_html(self, url):driver = webdriver.PhantomJS(executable_path=self.phantomjs_path)'''chrome_options = Options()#chrome_options.add_argument('--headless')chrome_options.add_argument('--user-agent=iphone')chrome_options.add_argument('--disable-gpu')driver = webdriver.Chrome(executable_path=self.chromedriver_path,chrome_options=chrome_options)'''logger(u'开始使用 phantomjs 加载网页:%s' %  url)try:driver.get(url) time.sleep(2) # 执行js得到整个页面内容html = driver.execute_script("return document.documentElement.outerHTML")driver.close()return htmlexcept Exception as e:logger(e)def parse_html_by_pyquery(self, html):if not html:logger("获得的网页有问题, 请检查。。。")else:logger('转换网页成功')return pq(html)def get_pageNumber(self,doc):#print (doc)#numcontent=doc('div[class=ui-paging-container]')numcontent=doc('li[class=ui-pager]')page_number=numcontent[len(numcontent)-1].text.strip()page_number =int(int(page_number) * 2.5)+1logger('current blogger has page num is  %s' % page_number)return page_numberdef get_artilcle_list(self,doc):logger('start to get article list...')acrticle_list=doc('div[class="article-item-box csdn-tracking-statistics"]')logger(len(acrticle_list))for acrticle in acrticle_list.items():tmp={}tmp['acticle_title']=acrticle('h4')('a').text().strip()read_num_content=acrticle('span[class=read-num]')[0].texttmp['read_num']=int(re.sub("\D","",read_num_content))#logger("read_num is %d" % tmp['read_num'])#acrticle_url=acrticle('p[class=content]')('a').attr('href')tmp['new_acrticle_url']=acrticle('h4')('a').attr('href')logger(tmp['new_acrticle_url'])self.contentList.append(tmp)#自定义排序功能,按照关键字对列表进行排序,然后将索引添加到字典中def mysort(self,listname,keywords,reverse=1):'''Parater:listname:需要处理的listkeywords:按照keywords进行排序reverse:正序还是逆序,1为正序,0为逆序'''from functools import cmp_to_keyif reverse:newlist=sorted(listname,key=cmp_to_key(lambda x,y:x[keywords]-y[keywords]) )else:newlist=sorted(listname,key=cmp_to_key(lambda x,y:y[keywords]-x[keywords]))for item in newlist:item['index'] = newlist.index(item)+1return newlistdef run(self):#第一步,获取页码数目main_html=self.get_selenium_js_html(self.csdn_url)main_doc=self.parse_html_by_pyquery(main_html)page_number=self.get_pageNumber(main_doc)#第二步,查找文章listfor i in range(1,int(page_number)):new_url=self.page_base_url+str(i)acrticle_html=self.get_html_by_request(new_url)acrticle_doc=self.parse_html_by_pyquery(acrticle_html)self.get_artilcle_list(acrticle_doc)logger(len(self.contentList))self.contentLists = self.mysort(self.contentList,"read_num",1 )logger(self.contentLists)return self.contentListsdef testA(self):		logger(len(self.mylisttest))contentList = self.mysort(self.mylisttest,"read_num",1)aa=[]for i in contentList:logger("index is  %d ...read num is: %d .... url is %s" % (i['index'],i['read_num'],i['new_acrticle_url']))tmp="index is  %d ...read num is: %d .... url is %s" % (i['index'],i['read_num'],i['new_acrticle_url'])aa.append(tmp)return aadef testForSortFunc(self):Tilist = self.mysort(self.mylisttest,'read_num',1)for i in Tilist:print (i['read_num'])Tilist = self.mysort(self.mylisttest,'read_num',0)for i in Tilist:print (i['read_num'])class HandleMyData():def __init__(self,data):self.myfoldername='qiqiyingse'self.needhandledata=datadef dealData(self):self.create_dir(self.myfoldername)filename=self.myfoldername+'/'+self.myfoldername+'.txt'self.save_content_to_file(filename,self.needhandledata)logger("data write in [text]  finished.....")self.run_to_save_info_in_excel(self.needhandledata)logger("data write in [excel]  finished.....")def test(self):logger('just a test')logger('not just a test ')#将内容存贮到excel中def run_to_save_info_in_excel(self,data):logger('start save info into excel')excel_w=Workbook()excel_sheet_name=time.strftime('%Y-%m-%d_%H-%M-%S')excel_table_name=time.strftime('%Y-%m-%d_%H-%M')excel_content_handler=excel_w.add_sheet(excel_sheet_name) first_line=[u'标题',u'阅读次数',u'文章地址',u'排名']cols=0for content in first_line:excel_content_handler.write(0,cols,content)cols +=1index=1for data_dict in data:cols=0for data_details in data_dict:#logger((data_details,data_dict[data_details],"内容写入excel"))excel_content_handler.write(index,cols,data_dict[data_details])cols +=1index +=1excel_w.save(self.myfoldername+'/'+self.myfoldername+excel_table_name+'.xls')#存储文章到本地	def save_content_to_file(self,title,content):logger('start to write info in [text]...')with open(title, 'w',encoding='utf-8') as f:for info_dict in content:f.write(str(info_dict)+'\n')for info in info_dict:#logger((info,info_dict[info]))#f.write(str(info)+str(info_dict[info])+'\n')f.write(str(info_dict[info])+'\t\t\t\t')f.write('\n')def create_dir(self,dirname):if not os.path.exists(dirname):os.makedirs(dirname)logger(" %s  not exists, create it" % dirname)else:logger("dirname already exist, didn't need to creat")class RunUrlInBrowser():def __init__(self,data):self.listData=datadef getUrlFromData(self):'''#用这种方式提取列表比较常规,但是代码也多urllist=[]for url in self.listData:urllist.append(url['new_acrticle_url'])return urllist	'''	return  [data_info['new_acrticle_url']  for data_info in self.listData]def LoadUrlAccordingtoLocalBrowser(self):import webbrowser as weburllist=self.getUrlFromData()t=5000while t:for i in range(1,9):logger(urllist[i])web.open_new_tab(urllist[i])time.sleep(5)os.system('taskkill /f /IM firefox.exe')t=t-1def welcom():print(''.center(50,'*'))print('Welcome to Spider of CSDN'.center(50,'*'))print('Created on 2018-08-20'.center(50,'*'))print('@author: Jimy _Fengqi'.center(50,'*'))print(''.center(50,'*'))if __name__ == '__main__':print ('''************************************************** **        Welcome to Spider of CSDN             ** **         Created on 2018-08-20                ** **         @author: Jimy _Fengqi                ** **************************************************''')welcom()mycsdn=CSDNSpider()data = mycsdn.run()myHandler=HandleMyData(data)myHandler.dealData()myBrowser=RunUrlInBrowser(data)myBrowser.LoadUrlAccordingtoLocalBrowser()#data=mycsdn.mylisttest#myHandler=HandleMyData(data)#myHandler.test()                    #引用类中的方法的时候,这里类本身不能有括号 ,就是不能写成myHandler().test() #myHandler.dealData()#mycsdn.run()#mycsdn.testfunc()

 

 

 

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 学习ARM的心得

    首先学习单片机,最好能找个前辈带一带。你能用51单片机做出一样实际的东西吗?即使它再简单!要注意加深对中断的理解。 再学习ARM单片机。(1)、细读《ARM微控制器基础与实战》周立功编写 (注:即使你不用书中的开发板)(2)、细读相关芯片的原版英文文档。如:arm920TE.pdf S…...

    2024/4/30 17:54:18
  2. Docker-个人博客系统的搭建-WordPress

    1:WordPress简介WordPress是PHP开发的一套个人博客系统 完全开源免费使用 并且有相关docker镜像;WordPress支持多种数据库2:WordPress的docker容器化部署2.1:部署的准备工作和步骤1:下载wordpress和mysql的docker image2:启动docker mysql的容器 、3:启动wordpress 下图是…...

    2024/4/30 17:44:01
  3. Inno Setup 基本视频教程

    Inno Setup 是一个免费的安装制作软件,小巧、简便、精美是其最大特点,支持pascal脚本,能快速制作出标准Windows2000风格的安装界面,足以完成一般安装任务。该软件用Delphi写成,其官方网站同时也提供源程序免费下载。它虽不能与Installshield这类恐龙级的安装制作软件相比,…...

    2024/4/14 21:07:50
  4. 看到一篇有关SQL效率问题的文章,觉得很不错

    (一).名词解释: 0。SQL 结构化查询语言(Structured Query Language) 1。非关系型数据库系统 做为第一代数据库系统的总称,其包括2种类型:“层次”数据库与“网状”数据库 “层次”数据库管理系统 eg:IBM&IMS (Information Management System) 特点:数据按层次模型组…...

    2024/4/17 8:05:52
  5. 复制转发CSDN博客快捷方法

    前言对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间里面,当然有人会说我们可以收藏博客啊,就不需要转载,(⊙o⊙)… 也对…...

    2024/4/14 21:07:48
  6. 不错的ARM学习网站

    ARM学习经典网站 2010-04-01 21:331.网友收集,未经过验证,如果网址有问题,请告诉我。 关于嵌入式开发的站点,提供非常多关于嵌入式开发的资料。包括开发公司,技术文档,免费资源等等。版面包括busses & boards,embedded software,dsp,embedded systems,open source,rt…...

    2024/4/16 4:16:00
  7. 主流PHP博客系统比较

    主流PHP博客系统比较 2009-02-27 11:31:13| 分类: 默认分类|举报|字号 订阅下载LOFTER我的照片书 |1.Wordpress http://www.wordpress.org/B2基础上开发而来,这是国内用户比较喜欢而且用户较多的一个php博客程序,缘由是因为Wordpress提供大量插件和模板,让你可以轻松的打…...

    2024/4/27 18:43:06
  8. Html.DropDownListFor 练习

    需要创建一个List<SelectListItem>数据集,如下使用已经存在FruitCategoryEntity.cs类的IEnumerable<FruitCategory> GetAllFruitCategory()数据集也行。public IEnumerable<FruitCategory> GetAllFruitCategory() {DataTable dt = objBusinessBase.GetDataT…...

    2024/4/24 23:32:16
  9. Makefile经典教程(掌握这些足够)

    该篇文章为转载,是对原作者系列文章的总汇加上标注。支持原创,请移步陈浩大神博客:http://blog.csdn.net/haoel/article/details/2886makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作…...

    2024/4/24 23:32:16
  10. MVC里面两个dropdownlist联动

    MVC view里面有两个dropdownlist分别邦定到两个属性View里面<div class="row"><div class="col-md-4">@Html.LabelFor(m => m.Name, new { @class = "form-label" })@Html.DropDownListFor(m => m.Id, (IEnumerable<Select…...

    2024/4/24 23:32:13
  11. 全栈练习二:简易个人博客系统数据库设计

    说明 本节从一个简易个人博客系统的框架和设计库设计开始探索。 功能描述 用户模块:注册,登录。 博文模块:发布,编辑,分类。 评论模块:发布,回复,编辑,删除。 后台管理:系统设置,用户管理。 表和字段设计 user:字段 类型 是否主键 是否为空 说明id integer Y N 自增…...

    2024/4/24 23:32:16
  12. Google浏览器的所有版本下载

    Google浏览器有很多版本,比如说:stable(稳定版),beta(测试版),dev(开发人员版),还有一个canary(金丝雀版)。这几个版本稳定性依次降低,但是性能和功能却依次上升,至于那个最好需要看个人的爱好:https://www.chromedownloads.net/另外,还有绿色破解版,这里就不多说。使…...

    2024/4/24 23:32:18
  13. ARM学习之图解ARM

    arm developer’s guide图:嵌入式arm的基本架构 图:应用软件运行在arm硬件上的抽象图 图:arm memory remap 图: arm内容数据流模型 图:arm在用户模式下可用的寄存器 图:图解状态寄存器 图:完整的arm寄存器集合 图: arm指令序列 图: arm指令执行的例子 图: arm向量表 …...

    2024/4/24 23:32:10
  14. curl命令详解

    对于windows用户如果用Cygwin模拟unix环境的话,里面没有带curl命令,要自己装,所以建议用Gow来模拟,它已经自带了curl工具,安装后直接在cmd环境中用curl命令就可,因为路径已经自动给你配置好了。linux curl是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上…...

    2024/4/24 23:32:16
  15. DropDownListFor

    转载于:https://www.cnblogs.com/william-CuiCui0705/p/8383710.html...

    2024/4/24 23:32:09
  16. Pytorch深度学习实战教程:语义分割基础与环境搭建

    一、前言该系列文章的内容有:Pytorch的基本使用语义分割算法讲解先从最简单的语义分割基础与开发环境搭建开始讲解。PS:由于微信不允许外部链接,你需要点击页尾左下角的“阅读原文”,才能访问文中的链接,文中的所有链接已使用蓝色字体标记。二、语义分割语义分割是什么?语…...

    2024/4/24 23:32:07
  17. ARM学习之ARM体系结构

    本文主要针对ARM cortex-A9处理器的研究。ARM采用的是32位的RISC架构数据类型:Byte 字节 8bitHalfword 半字 16bit(v4以上版本)Word 字 32bit ARM内核只提供FIQ和IRQ两种中断向量。ARM支持大端模式和小端模式两种存储方式。工作模式:User:用户模式System:系统模式,和User模…...

    2024/4/24 23:32:07
  18. 瓦片地图的下载

    自定义地图数据瓦片化请求的一种实现方案: http://blog.csdn.net/boonya/article/details/50548135A1.0.1 如何下载地图瓦片?记录我的实现过程: http://blog.csdn.net/u_9_5/article/details/50350467...

    2024/4/14 21:08:05
  19. php开源博客系统

    LifeType点击次数:37654 lifetype是一个开源的Blog平台,在同一个系统中支持多个Blog和多个用户。它具有: 友好的用户界面通过所见即所得文章编辑器,你可以编排出整齐漂亮包含图片,声音以及视频的的文章。做到 Podcasting的功能。此外通过摘要页面,你可以在每次登入管理者…...

    2024/4/14 21:08:04
  20. 渗透测试工具有哪些?

    今天在网上看到一篇关于渗透测试工具的列举,点开一看,实在汗颜,好多我都没听过,列出来以便我以后学习时候查看自己还有哪些不足首先是渗透流程 1. 综合扫描 2. 目录检测 3. 注入检测 4. 旁注与c段 5. 抓包改包 6. webshell 7. 提权工具 8. arp嗅探 7. 社会工程 8. 破解工具…...

    2024/4/30 9:47:28

最新文章

  1. 基于OpenCv的图像二值图和灰度直方图

    ⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…...

    2024/4/30 19:43:08
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 自动化标准Makefile与lds

    makefile的自动化&#xff0c;需要使用变量&#xff0c;以及自动变量。 实行命令行与参数的分离。 命令行只与变量打交道&#xff0c;而变量则携带不同的参数&#xff0c;这样&#xff0c;通过修改变量&#xff0c;命令的执行结果不同。 可以简单理解为&#xff0c;命令行是个…...

    2024/4/30 2:45:52
  4. llama.cpp运行qwen0.5B

    编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…...

    2024/4/30 5:06:46
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57