Selenium实例

其实数学建模过去了,反而不知道更新什么。最近在学统计学之类的东西,还有网络爬虫,就更一些实例吧。网络爬虫刚考完期末考,脑子里面的知识还新鲜。

网络爬虫其实是要磨洋工,当你写不会的时候,放一下再写也没关系。我的实例写了两三天吧,也是断断续续的写。

我们的期末项目是爬取疫情信息,我的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中。基于此,我们获取了一整页子页的所有包含所需文本的源代码啦。

Selenium实例_第1张图片

 如果把我们需要的东西比作一个珍珠,那么我们所获取的东西就是混杂着沙子的珍珠,我们需要一个筛子把珍珠筛出来。所以正则表达式就是那个筛子,也是网络爬虫的重要内容。不然很可能你获取的东西是空的,所以建议重点学习。

下面的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"))

你可能感兴趣的:(爬虫,selenium,python)