其实数学建模过去了,反而不知道更新什么。最近在学统计学之类的东西,还有网络爬虫,就更一些实例吧。网络爬虫刚考完期末考,脑子里面的知识还新鲜。
网络爬虫其实是要磨洋工,当你写不会的时候,放一下再写也没关系。我的实例写了两三天吧,也是断断续续的写。
我们的期末项目是爬取疫情信息,我的selenium使用了两种方法。这篇东西就先写第一个方法,后面有时间就更新第二个方法。
项目要求:获取三页的所有疫情消息,并把疫情消息写进txt或者excel中。
思路一:
首先导入需要的包:记得如果要用selenium的话,需要使用谷歌浏览器模拟点击,安装chromedriver。应该CSDN有相关的帖子,大佬们写得很全面,需要的话可以去搜一下,这里不做过多赘述。
import re
from selenium import webdriver
import time
import pandas
import numpy as np
from selenium.webdriver.common.by import By # 导入相关的包
其次获得三页的父页网址,并放在一个列表中。如果网址少,可以这么做,但是网址多建议还是找规律进行循环生成网址。
list=['存放网址列表']
我们首先模拟打开一个网页,爬取的第一步是要获取父层的源代码。所以将窗口最大化,并且使用browser.get()函数获取源代码。
browser = webdriver.Chrome()
browser.maximize_window() # 窗口最大化
browser.get(c)
data = browser.page_source # 获取父层页面的源代码
browser.get()的括号里面放的是网址url。所以我设置了一个循环,循环获取之前列表里面存在的网址。下面是这一部分完整的代码。
list=['网址']
list_d=[]
for c in list:
import re
from selenium import webdriver
import time
import pandas
import numpy as np
from selenium.webdriver.common.by import By # 导入相关的包
browser = webdriver.Chrome()
browser.maximize_window() # 窗口最大化
browser.get(c)
data = browser.page_source # 获取父层页面的源代码
然后我们就获取了父网页的源代码了,并且在这之后我们需要模拟点击打开网页,获取子页的源代码,我们需要的文本信息就存在子页的源代码里面。
所以接下来,我们要模拟点击链接,并且点击之后返回父页面点击下一条子页,一个个的页面打开并且获取其源代码。这里使用的是xpath的方法,点击进入子页还有其他的方法,感兴趣的同志可以自己去了解一下。从父页子页进去出来切换的语句使用的是句柄的方法。
browser.find_element(By.XPATH,f'XPATH地址').click() # 获取第一个子页的源代码
handles = browser.window_handles # 获取浏览器所有窗口句柄,也即各个窗口的身份信息
browser.switch_to.window(handles[-1]) # 切换到最开始打开的窗口
data_a = browser.page_source
browser.close()
browser.switch_to.window(handles[0]) # 切换到最新(倒数第一个)打开的窗口
time.sleep(3)
因为子页面不止一个,所以我们要实现不断点击其他的子页,可以找xpath的规律,我们可以发现,xpath除了在/li后面的数字不一样,其他都是一样的。所以我设置了一个循环,从2到22,循环放进xpath中。基于此,我们获取了一整页子页的所有包含所需文本的源代码啦。
如果把我们需要的东西比作一个珍珠,那么我们所获取的东西就是混杂着沙子的珍珠,我们需要一个筛子把珍珠筛出来。所以正则表达式就是那个筛子,也是网络爬虫的重要内容。不然很可能你获取的东西是空的,所以建议重点学习。
下面的obj1后面就是用re库中的正则表达式进行筛选,这里我用的是贪婪匹配,data_all的那条是使用了sub()函数为了替换掉源代码中的反爬内容。输出的结果有findall和finditer两种方法,我使用findall也是因为其输出的直接就是列表了。当然,各有各的好处,有兴趣的同志也可以自己去了解。
obj1 = re.compile(r'正则表达式', re.S)
data_all = re.sub("<.*?>", "", data_a)#替换掉源代码中的反爬内容。
final_obj1 = obj1.findall(data_all) # 输出结果
最后我将筛选出来的内容存入txt文件内部。就完成了。
for k in final_obj1:
print(k, file=open(r'文件路径', 'a+', encoding="utf-8"))
在这里放出完整代码,有什么不好的欢迎指正或者私戳交流。
#方法一
list=["网址"]
for c in list:
import re
from selenium import webdriver
import time
import pandas
import numpy as np
from selenium.webdriver.common.by import By # 导入相关的包
browser = webdriver.Chrome()
browser.maximize_window() # 窗口最大化
browser.get(c)
data = browser.page_source # 获取父层页面的源代码
for i in range(2, 22):
browser.find_element(By.XPATH,f'xpath地址').click() # 获取第一个子页的源代码
handles = browser.window_handles # 获取浏览器所有窗口句柄,也即各个窗口的身份信息
browser.switch_to.window(handles[-1]) # 切换到最开始打开的窗口
data_a = browser.page_source
browser.close()
browser.switch_to.window(handles[0]) # 切换到最新(倒数第一个)打开的窗口
time.sleep(3)
obj1 = re.compile(r'正则表达式', re.S)
data_all = re.sub("<.*?>", "", data_a)
final_obj1 = obj1.findall(data_all) # 输出结果
for k in final_obj:
print(k, file=open(r'文件路径', 'a+', encoding="utf-8"))