python selenium 爬虫 模拟浏览网站内容

使用python selenium编写的爬虫代码,模拟用户浏览某个网站内容,废话少说进入正文。

1、爬虫界面如下:

python selenium 爬虫 模拟浏览网站内容

界面使用说明:

第一步:填写要访问的网站地址

第二步:填写每天访问该网址的次数

第三步:点击“开始刷量”按钮开始访问网站内容 

 

2、爬虫源代码介绍:

1)点击“开始刷量”按钮调用runjob方法,runjob具体代码如下:

# 访问网站操作代码
def  runjob():
    # m, s = divmod(second, 60)
    # h, m = divmod(m, 60)
    # hms = "{:02}:{:02}:{:02}".format(h, m, s)
    # logger.info(hms)
    #a、 如果人工停止刷量,则直接结束当前线程,并刷新界面
    if (myframe.stop_refresh_page_thread):
        # 增加刷量
        addrefreshnum()
        # 刷新页面
        myframe.refresh_run_stop_button()
        return

    # b、正常执行任务
    refreshnum = myframe.refreshnum
    siteurl = myframe.siteurlinput.GetValue().strip()
    my_logger_info(logger,"==开始网站%s第%d次刷量<直接访问>=="%(siteurl,refreshnum+1))

    try:
        # 创建浏览器
        driver = createWebDriver()
        # 浏览器最大化
        driver.maximize_window()
        # 浏览网站
        viewSite(driver,siteurl)
    except Exception as e:
        info = traceback.format_exc()
        my_logger_info(logger,info)
        driver.save_screenshot(".\\refreshpage_directvisit_error.png")
        myframe.stop_refresh_page_thread=True
    finally:
        # 关闭浏览器
        driver.quit()
        # 增加刷量
        addrefreshnum()
        # 正常执行后刷新界面
        myframe.refresh_run_stop_button()

    # 打印日志
    my_logger_info(logger,"==完成网站%s第%d次刷量<直接访问>=="%(siteurl,refreshnum+1))

2)runjob=>createWebDriver()代码如下 

#创建浏览器驱动
def createWebDriver():
    # 配置参数
    options = webdriver.ChromeOptions()
    # 设置网页编码
    options.add_argument('lang=zh_CN.UTF-8')
    # 禁止加载图片
    options.add_argument('blink-settings=imagesEnabled=false')
    # 禁用sandbox
    options.add_argument('--no-sandbox')
    # *面模式
    options.add_argument('headless')
    driver = webdriver.Chrome(options=options, keep_alive=True)
    # 防止selenium访问被识别出来,不算流量
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
            })
          """
    })

    return driver

3)runjob=>viewSite(driver,siteurl)代码如下

# 模拟浏览网站
def  viewSite(driver,url):
    my_logger_info(logger,"<<开始访问网站:%s"% url)
    driver.get(url)
    pagesource = driver.page_source
    runIdleSomeTime(random.randint(3, 5))
    linklist = []
    linklist.append("桥架国标")
    linklist.append("桥架价格")
    linklist.append("桥架安装")
    prodlist = []
    prodlist.append("桥架配件")
    prodlist.append("桥架规格")

    for i in range(len(prodlist)):
        # 支持人工停止刷量
        if (myframe.stop_refresh_page_thread):
            break
        lanmu = prodlist[i]
        viewProductOfLanmu(driver, lanmu)

    for i in range(len(linklist)):
        # 支持人工停止刷量
        if (myframe.stop_refresh_page_thread):
            break
        lanmu = linklist[i]
        viewArticleOfLanmu(driver, lanmu)



    # 支持人工停止刷量
    if (myframe.stop_refresh_page_thread):
        my_logger_info(logger, "已经停止刷量")

    my_logger_info(logger,">>完成访问网站:%s" % url)

4)runjob=>viewSite(driver,siteurl)=>viewProductOfLanmu(driver,lanmu)代码如下

# 查看栏目产品
def viewProductOfLanmu(driver,lanmu):
    # 浏览相关栏目
    link_d = driver.find_element_by_link_text(lanmu)
    # 不直接使用link.click(),避免被其他咨询窗口遮挡
    driver.execute_script("arguments[0].click();", link_d)
    # 等待栏目第一页加载完成
    runIdleSomeTime(random.randint(3, 5))
    # 支持人工停止刷量
    if (myframe.stop_refresh_page_thread):
        return
    pagesource = driver.page_source
    soup = BeautifulSoup(pagesource, "html.parser")
    # logger.debug(soup.prettify())

    while True:
        # 查看当前页所有文章
        newsdiv_s = soup.find("div", class_="list").find_all("div", class_="mask")
        for i in range(len(newsdiv_s)):
            link=newsdiv_s[i].find("a")
            my_logger_info(logger,"访问页面:%s" % link['href'])
            # 在新的窗口打开文章
            js = "window.open('" + link['href'] + "','_blank');"
            try:
                driver.execute_script(js)
            except Exception as e:
                info = traceback.format_exc()
                my_logger_info(logger, info)
                continue
            # driver.implicitly_wait(3)
            # 查看打开的文章内容
            runIdleSomeTime(random.randint(5, 7))
            # 支持人工停止刷量
            if (myframe.stop_refresh_page_thread):
                break
            # driver.close()
            # 获取当前打开的所有窗口
            windows = driver.window_handles
            # 转换到最新打开的窗口
            driver.switch_to.window(windows[-1])
            driver.close()
            # 转换到父窗口
            driver.switch_to.window(windows[0])
            # 在当前页浏览文章
            runIdleSomeTime(random.randint(1, 3))
            # 支持人工停止刷量
            if (myframe.stop_refresh_page_thread):
                break

        # 支持人工停止刷量
        if (myframe.stop_refresh_page_thread):
            break
        # 判断是否有下一页
        pagediv_s = soup.find("div", class_="pageBox")
        nextpagelink_s=pagediv_s.find("a",text="下一页")
        if (not nextpagelink_s):
            break
        # 尝试翻转到下一页,翻页失败则不再进行
        nextpagelink_d = driver.find_element_by_link_text("下一页")
        driver.execute_script("arguments[0].click();", nextpagelink_d)
        # 等待栏目当前页加载完成
        runIdleSomeTime(random.randint(3, 5))
        pagesource = driver.page_source
        soup = BeautifulSoup(pagesource, "html.parser")

 5)runjob=>viewSite(driver,siteurl)=>viewArticleOfLanmu(driver,lanmu)代码如下

# 查看栏目文章
def viewArticleOfLanmu(driver,lanmu):
    # 浏览相关栏目
    link_d = driver.find_element_by_link_text(lanmu)
    # 不直接使用link.click(),避免被其他咨询窗口遮挡
    driver.execute_script("arguments[0].click();", link_d)
    # 等待栏目第一页加载完成
    runIdleSomeTime(random.randint(3, 5))
    # 支持人工停止刷量
    if (myframe.stop_refresh_page_thread):
        return
    pagesource = driver.page_source
    soup = BeautifulSoup(pagesource, "html.parser")
    # logger.debug(soup.prettify())

    while True:
        # 查看当前页所有文章
        newsdiv_s = soup.find("div", class_="newsList")
        for link in newsdiv_s.find_all("a", class_="look"):
            my_logger_info(logger,"访问页面:%s" % link['href'])
            # 在新的窗口打开文章
            js = "window.open('" + link['href'] + "','_blank');"
            driver.execute_script(js)
            # driver.implicitly_wait(3)
            # 查看打开的文章内容
            runIdleSomeTime(random.randint(5, 7))
            # 支持人工停止刷量
            if (myframe.stop_refresh_page_thread):
                break
            # driver.close()
            # 获取当前打开的所有窗口
            windows = driver.window_handles
            # 转换到最新打开的窗口
            driver.switch_to.window(windows[-1])
            driver.close()
            # 转换到父窗口
            driver.switch_to.window(windows[0])
            # 在当前页浏览文章
            runIdleSomeTime(random.randint(5, 7))
            # 支持人工停止刷量
            if (myframe.stop_refresh_page_thread):
                break

        # 支持人工停止刷量
        if (myframe.stop_refresh_page_thread):
            break
        # 判断是否有下一页
        pagediv_s = soup.find("div", class_="pageBox")
        nextpagelink_s=pagediv_s.find("a",text="下一页")
        if (not nextpagelink_s):
            break
        # 尝试翻转到下一页,翻页失败则不再进行
        nextpagelink_d = driver.find_element_by_link_text("下一页")
        driver.execute_script("arguments[0].click();", nextpagelink_d)
        # 等待栏目当前页加载完成
        runIdleSomeTime(random.randint(3, 5))
        pagesource = driver.page_source
        soup = BeautifulSoup(pagesource, "html.parser")

3、爬虫访问示例网站地址:

http://www.jywy.bj.cn

欢迎有兴趣的同学留言交流。

 

上一篇:java-GUI-画笔


下一篇:【Java】图形界面设计实战练习