parent
							
								
									a885e6b63e
								
							
						
					
					
						commit
						dbd4cd1e68
					
				| @ -1,172 +0,0 @@ | |||||||
| import re |  | ||||||
| import requests |  | ||||||
| import random |  | ||||||
| from util import Crawler |  | ||||||
| from lxml import etree |  | ||||||
| from datetime import datetime |  | ||||||
| from selenium import webdriver |  | ||||||
| from selenium.webdriver.common.by import By |  | ||||||
| from selenium.webdriver.support.ui import WebDriverWait |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class CrawlerDataSource1(Crawler): |  | ||||||
|     """包含数据1爬虫普通做法相应函数的类""" |  | ||||||
|     def __init__(self) -> None: |  | ||||||
|         super().__init__() |  | ||||||
|         self.driver = self.setup_driver() |  | ||||||
|         self.url = random.choice(self.data_source_1) |  | ||||||
| 
 |  | ||||||
|     def setup_driver(self): |  | ||||||
|         """设置driver""" |  | ||||||
|         option = webdriver.EdgeOptions() |  | ||||||
|         # 添加实验性选项"detach"并设置为True |  | ||||||
|         option.add_experimental_option("detach", True) |  | ||||||
|         driver = webdriver.Edge(options=option) |  | ||||||
|         return driver |  | ||||||
| 
 |  | ||||||
|     def crawler_2(self) -> str: |  | ||||||
|         """单线程爬取数据2""" |  | ||||||
|         driver = self.driver |  | ||||||
| 
 |  | ||||||
|         try: |  | ||||||
|             driver.get(self.url) |  | ||||||
|             # 等待页面加载 |  | ||||||
|             element = WebDriverWait( |  | ||||||
|                 driver, 10).until(lambda x: driver.find_element( |  | ||||||
|                     by=By.XPATH, |  | ||||||
|                     value= |  | ||||||
|                     '//*[@id="app"]/div[2]/div[2]/div[2]/div[1]/div[1]/div[2]') |  | ||||||
|                                   ) |  | ||||||
| 
 |  | ||||||
|             text_content = element.text |  | ||||||
| 
 |  | ||||||
|             return text_content |  | ||||||
|         except Exception as result: |  | ||||||
|             print(f"发现错误:{result}") |  | ||||||
|             return "" |  | ||||||
|         finally: |  | ||||||
|             driver.quit() |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class CrawlerDataSource2(Crawler): |  | ||||||
|     """包含数据2爬虫普通做法相应函数的类""" |  | ||||||
|     def __init__(self) -> None: |  | ||||||
|         super().__init__() |  | ||||||
| 
 |  | ||||||
|     def crawler_2(self, url: str): |  | ||||||
|         """单线程爬取数据2""" |  | ||||||
|         try: |  | ||||||
|             response = requests.post(url, headers=self.get_headers()) |  | ||||||
|             html = response.content.decode('utf-8') |  | ||||||
|             tree = etree.HTML(html) |  | ||||||
|             text = tree.xpath('/html/body/div/div/div[4]/div[1]/p/text()')[0] |  | ||||||
|             return text |  | ||||||
|         except Exception as result: |  | ||||||
|             print(f"发现错误: {result}") |  | ||||||
|             # time.sleep(3) |  | ||||||
|             return None |  | ||||||
| 
 |  | ||||||
|     def get_data_2(self) -> str: |  | ||||||
|         """获取数据源2的一些数据并以字符串的形式收集到content中""" |  | ||||||
|         content = '' |  | ||||||
|         for url in self.data_source_2: |  | ||||||
|             text = self.crawler_2(url) |  | ||||||
|             if text: |  | ||||||
|                 content = content + self.crawler_2(url) |  | ||||||
|         return content |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class CrawlerDataSource3(Crawler): |  | ||||||
|     """包含数据3爬虫普通做法相应函数的类""" |  | ||||||
|     def __init__(self) -> None: |  | ||||||
|         super().__init__() |  | ||||||
| 
 |  | ||||||
|     def crawler_3(self, url: str): |  | ||||||
|         """单线程爬取数据3""" |  | ||||||
|         try: |  | ||||||
|             response = requests.get(url, headers=self.get_headers()) |  | ||||||
|             text = response.content.decode('utf-8') |  | ||||||
|             return text |  | ||||||
|         except Exception as result: |  | ||||||
|             print(f"发现错误: {result}") |  | ||||||
|             # time.sleep(3) |  | ||||||
|             return None |  | ||||||
| 
 |  | ||||||
|     def get_data_3(self) -> str: |  | ||||||
|         """获取数据源3的一些数据并以字符串的形式收集到content中""" |  | ||||||
|         content = '' |  | ||||||
|         for url in self.data_source_3: |  | ||||||
|             text = self.crawler_3(url) |  | ||||||
|             if text: |  | ||||||
|                 content = content + self.crawler_3(url) |  | ||||||
|         return content |  | ||||||
| 
 |  | ||||||
|     def get_freqs_of_En(self, content: str) -> list[tuple[str, int]]: |  | ||||||
|         """获取英文文本的词频""" |  | ||||||
|         # 获取单词 |  | ||||||
|         pattern = re.compile('[\W_]+') |  | ||||||
|         word_list = pattern.sub(' ', content).lower() |  | ||||||
|         word_list = word_list.split() |  | ||||||
| 
 |  | ||||||
|         # 过滤停用词 |  | ||||||
|         word_list = [ |  | ||||||
|             w for w in word_list if (w not in self.stop_words) and len(w) >= 3 |  | ||||||
|         ] |  | ||||||
| 
 |  | ||||||
|         # 统计词频 |  | ||||||
|         word_freqs = {} |  | ||||||
|         for word in word_list: |  | ||||||
|             word_freqs[word] = word_freqs.get(word, 0) + 1 |  | ||||||
| 
 |  | ||||||
|         # 排序 |  | ||||||
|         word_freqs = sorted(word_freqs.items(), |  | ||||||
|                             key=lambda x: x[1], |  | ||||||
|                             reverse=True) |  | ||||||
|         return word_freqs |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def work1() -> None: |  | ||||||
|     """简单方法爬取数据1""" |  | ||||||
|     cds1 = CrawlerDataSource1() |  | ||||||
|     content = cds1.crawler_2() |  | ||||||
|     word_freqs = cds1.get_freqs(content) |  | ||||||
|     cds1.print_freqs(word_freqs) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def work2() -> None: |  | ||||||
|     """简单方法爬取数据2""" |  | ||||||
|     cds2 = CrawlerDataSource2() |  | ||||||
|     content = cds2.get_data_2() |  | ||||||
|     word_freqs = cds2.get_freqs(content) |  | ||||||
|     cds2.print_freqs(word_freqs) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def work3() -> None: |  | ||||||
|     """简单方法爬取数据3""" |  | ||||||
|     cds3 = CrawlerDataSource3() |  | ||||||
|     content = cds3.get_data_3() |  | ||||||
|     word_freqs = cds3.get_freqs_of_En(content) |  | ||||||
|     cds3.print_freqs(word_freqs) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| if __name__ == '__main__': |  | ||||||
|     print("开始爬取数据1……") |  | ||||||
|     t0 = datetime.now() |  | ||||||
|     work1() |  | ||||||
|     t1 = datetime.now() |  | ||||||
|     print(f"数据1耗时:{t1-t0}") |  | ||||||
|     print("数据1爬取结束。\n") |  | ||||||
| 
 |  | ||||||
|     print("开始爬取数据1……") |  | ||||||
|     t0 = datetime.now() |  | ||||||
|     work2() |  | ||||||
|     t1 = datetime.now() |  | ||||||
|     print(f"数据2耗时:{t1-t0}") |  | ||||||
|     print("数据2爬取结束。\n") |  | ||||||
| 
 |  | ||||||
|     print("开始爬取数据1……") |  | ||||||
|     t0 = datetime.now() |  | ||||||
|     work3() |  | ||||||
|     t1 = datetime.now() |  | ||||||
|     print(f"数据3耗时:{t1-t0}") |  | ||||||
|     print("数据3爬取结束。\n") |  | ||||||
					Loading…
					
					
				
		Reference in new issue