当前位置:   article > 正文

简单又详细的网页爬虫案例

网页爬虫

导入包 

  1. import requests
  2. import re
  3. import json
  4. from bs4 import BeautifulSoup
  5. import datetime
  6. from apscheduler.schedulers.blocking import BlockingScheduler
  7. from apscheduler.triggers.interval import IntervalTrigger
  8. from apscheduler.schedulers.background import BackgroundScheduler
  9. import pandas as pd
  10. from snownlp import SnowNLP
  11. import numpy as np

获取自己要爬取的网站地址 、cookie和User-Agent

  1. base_url = '' #爬取的网站
  2. cookie='' #自己的浏览器cookie
  3. headers = {'User-Agent': '',#自己浏览器的User-Agent
  4. 'Cookie':cookie,
  5. 'Accept-Encoding':'gzip, deflate, br',
  6. }
'
运行

函数封装

  • 所有函数封装在一个spider类里面,模块化开发。
  • Timed_crawling()函数:实现定时爬取功能,使用apscheduler模块。
  • apscheduler模块中BlockingScheduler类和BackgroundScheduler类都可以用来定时任务爬取数据,区别在于BlockingScheduler是阻塞的,就是start()以后如果没有爬完就不会进行下面的代码,jupyter notebook可以看到一直是*。如果想要运行下面的代码而让爬虫在后台仍然运行,可以将BlockingScheduler改成BackgroundScheduler类,scheduler = BackgroundScheduler(timezone='Asia/Shanghai')。
  • data1=re.compile('target="_blank">(.+)</a>')   data2=data1.findall(soup)[1:-2],这两句代码的意思是在爬取网页的html页面内容soup后,获取全部以target="_blank">开头 </a>结束的中间内容,这里截取的是热搜内容。当然你也可以根据你想获取的内容,使用其他正则表达式获取。
  • 情感分析使用的是snownlp模块,可以输出情感分数,越高越积极,越低越消极。 
  1. class spider():
  2. def __init__(self, base_url, cookie,headers):
  3. self.base_url = base_url
  4. self.cookie = cookie
  5. self.headers=headers
  6. def web_crawler(self):#爬虫
  7. response = requests.get(self.base_url, headers=self.headers)
  8. response.raise_for_status()
  9. response.encoding = response.apparent_encoding
  10. data = response.text
  11. soup = str(BeautifulSoup(data,'lxml'))#解析
  12. data1=re.compile('target="_blank">(.+)</a>')
  13. data2=data1.findall(soup)[1:-2]
  14. print(datetime.datetime.now(),len(data2))
  15. print(data2)
  16. print("******************************************************************")
  17. file = open('wb_result.txt','a',encoding='utf-8')
  18. for i in data2:
  19. file.write( str(datetime.datetime.now())[:19]+"," )
  20. file.write( i+"\n" )
  21. # 关闭打开的文件
  22. file.close()
  23. def Timed_crawling(self):#定时调度,改时间就可
  24. scheduler = BlockingScheduler(timezone='Asia/Shanghai')
  25. scheduler.add_job(self.web_crawler, 'interval', seconds=900,start_date='2023-04-16 12:17:00',end_date='2023-04-16 12:18:00')
  26. #scheduler.remove_job(0)
  27. scheduler.start()
  28. #scheduler.shutdown(wait=False)
  29. def data(self):#数据读取与处理
  30. df = pd.read_csv("wb_result.txt", sep=",", names=["time", "hot_word"])
  31. return df
  32. def Sentiment_analysis(self,df):#情感分析
  33. E_word=list(set(df["hot_word"]))
  34. E_result={}
  35. for i in E_word:
  36. E_result[i]=SnowNLP(i).sentiments
  37. E_result=pd.Series(E_result)
  38. Most_negative=E_result.sort_values(ascending=False)[-3:].reset_index()
  39. most_positive=E_result.sort_values(ascending=False)[:3].reset_index()
  40. Most_negative.columns=["Most_negative_hotword","scores"]
  41. Most_negative=Most_negative.sort_values(by=['scores'],ascending=True)
  42. most_positive.columns=["most_positive_hotword","scores"]
  43. Most_negative.index=["第一名","第二名","第三名"]
  44. most_positive.index=["第一名","第二名","第三名"]
  45. print("最正面的3条和最负面的3条热搜如下")
  46. display(pd.concat([Most_negative,most_positive],axis=1,join='inner'))
  47. def Hot_search_queries(self,df):#热搜查询
  48. hot_search_statistics=pd.DataFrame()
  49. for i in list(set(df.time)):
  50. hot=df[df["time"]==i].hot_word
  51. hot=pd.DataFrame(hot.values,columns=[i])
  52. hot_search_statistics=pd.concat([hot_search_statistics,hot],axis=1)
  53. hot_search_statistics=hot_search_statistics.sort_index(axis=1)
  54. print("历史某节点热搜榜单:\n -----------------")
  55. hot_search_statistics.index=hot_search_statistics.index.values+1
  56. hot_search_statistics.index.name="rank"
  57. display(hot_search_statistics)
  58. def length_on_list(self,df):#在榜时长
  59. length_on_list_total={}
  60. for t in list(set(df.hot_word)):
  61. #print(t)
  62. L=df[df["hot_word"]==t].time.to_list()
  63. i=1
  64. length_on_list=0
  65. while i<len(L)-1:
  66. end_time=datetime.datetime.strptime(L[i+1], "%Y-%m-%d %H:%M:%S")
  67. #print(end_time)
  68. start_time=datetime.datetime.strptime(L[i], "%Y-%m-%d %H:%M:%S")
  69. #print(start_time)
  70. #print((end_time-start_time).seconds)
  71. if (end_time-start_time).seconds==900:
  72. length_on_list=length_on_list+900
  73. i=i+1
  74. if length_on_list==0:
  75. length_on_list_total[t]="小于15分钟"
  76. else:
  77. length_on_list_total[t]=length_on_list/60
  78. print("在榜时长:\n-----------------")
  79. display(pd.DataFrame({"hot_word":length_on_list_total.keys(),
  80. "on_list(min)":length_on_list_total.values()}) )
'
运行

 函数调用

  1. weibo_spider=spider(base_url,cookie,headers)
  2. weibo_spider.Timed_crawling()
  3. df=weibo_spider.data()
  4. weibo_spider.Sentiment_analysis(df)
  5. weibo_spider.Hot_search_queries(df)
  6. weibo_spider.length_on_list(df)

此代码可以在jupyter notebook 跑,若只想跑通爬虫代码,可以删除weibo_spider.Sentiment_analysis(df)
weibo_spider.Hot_search_queries(df)
weibo_spider.length_on_list(df),这三个函数,因为他们是用来做统计的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/845302
推荐阅读
相关标签
  

闽ICP备14008679号