js 爬虫抓取网页数据(【VisualStudio】如何获取加载js渲染后的网页源码)

优采云 发布时间: 2021-10-24 05:12

  js 爬虫抓取网页数据(【VisualStudio】如何获取加载js渲染后的网页源码)

  一、前言

  由于工作需要,需要爬取一个网页的表格数据,也需要用C#编写。我自己搜了一下,做了这个教程。

  二、思考

  一开始用WebClient类爬取,发现是爬html没有加载js,没有表数据。我觉得这个应该是得到了加载js渲染出来的网页的源码。读取请求后,有一个html。两个jsons之一是目标数据,可惜我对比了一下,请求url没有拼写出来,加上payload参数的请求失败,所以放弃了,把目标转入js渲染后的源代码

  三、库安装

  全开,C#!那必须是 Visual Studio! ! !

  先新建一个工程,你喜欢控制台程序还是窗口程序,我用的是控制台程序

  然后安装项目所需的库

  Selenium.WebDriver.ChromeDriver

  Selenium.PhantomJS.WebDriver

  Selenium.WebDriver ps:只有低版本有OpenQA.Selenium.PhantomJS,我安装了3.0.0

  安装完成后生成

  四、代码代码

  using System;

//添加selenium的引用

using OpenQA.Selenium.PhantomJS;

using OpenQA.Selenium.Chrome;

//using OpenQA.Selenium.Support.UI;

using OpenQA.Selenium;

using System.IO;

using System.Collections.Generic;

using System.Text;

using System.Threading;

using System.Data;

using System.Text.RegularExpressions;

namespace ConsoleApplication1

{

class Program

{

static ChromeDriver driver { get; set; }

static ICookieJar cookie { get; set; }

static void Main(string[] args)

{

var url = @"https://s8hwxkltn6.jiandaoyun.com/dash/5f48d400a25baa0006034c29";

GetHtml(url);

}

private static void GetHtml(string url)

{

PhantomJSDriverService driverService = PhantomJSDriverService.CreateDefaultService();

driverService.IgnoreSslErrors = true;

ChromeOptions options = new ChromeOptions();

options.AddArgument("--headless");

options.AddArgument("--nogpu");

List tagNmaeList = new List();

using (driver = new ChromeDriver(options))

{

try

{

driver.Manage().Window.Maximize();

driver.Navigate().GoToUrl(url);

Thread.Sleep(5000);

Console.WriteLine(driver.PageSource); //输出网页源码

}

catch (NoSuchElementException)

{

Console.WriteLine("找不到该元素"); ;

}

}

}

  五、分析数据

  如何添加

  //分析HTML 数据

private static void GetData(string ddd)

{

DataRow dr;

DataTable dt = new DataTable(); //创建datatable,存储数据

dt.Columns.Add(new System.Data.DataColumn("序号", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("要求到货时间", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("合同号", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("地址", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("货物名称", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("规格型号", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("公司型号", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("单位", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("数量", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("理论重量", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("金额", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("备注", typeof(System.String)));

dt.Columns.Add(new System.Data.DataColumn("合同号2", typeof(System.String)));

string oo = string.Empty;

string kk = string.Empty;

string ll = string.Empty;

string hh = string.Empty;

string fileConent = string.Empty;

string tableContent = string.Empty;

string rowContent = string.Empty;

string columnConent = string.Empty;

string rowPatterm = @"]*>[\s\S]*?"; // 正则取tr行

string columnPattern = @"]*>[\s\S]*?"; // 正则取每行的单元格

MatchCollection rowCollection = Regex.Matches(ddd, rowPatterm, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); //对tr进行筛选

for (int i = 1; i 3) dr[j] = strWeb;

}

else

{

if (j == 0) dr[j] = oo;

if (j == 1) dr[j] = kk;

if (j == 2) dr[j] = ll;

if (j == 3) dr[j] = hh;

dr[j + 4] = strWeb;

}

}

dt.Rows.Add(dr);

#endregion

}

}

  六、翻页

  修改GetHtml()方法中的部分,其中

  using (driver = new ChromeDriver(options))

{

try

{

driver.Manage().Window.Maximize();

driver.Navigate().GoToUrl(url);

Thread.Sleep(5000);

// 点击按钮

driver.ExecuteScript("return $('.count-sel').click()");

Thread.Sleep(500);

// 选择一百条每页

driver.ExecuteScript("return $(\".x-dropdown a[option='100']\").click()");

Thread.Sleep(1000); // 给点时间加载网页

//Console.WriteLine(driver.PageSource); //输出网页源码

//GetCookie();

GetData(driver.PageSource); // 调用解析数据方法,得到数据datatable

}

catch (NoSuchElementException)

{

Console.WriteLine("找不到该元素"); ;

}

}

  七、登录问题

  下面的方法是为了演示如何登录,说白了就是用js代码模拟输入,点击登录,实现自动代码登录。网站,仅供参考

  private static void Login(ChromeDriver driver)

{

// driver.FindElement(By.Id("btn_Login")).GetAttribute("value");

//2.执行 js 获取 value 的值

//driver.ExecuteScript("return document.getElementsById('txt_AccountId')[0].value;");

driver.ExecuteScript("return $('#帐号输入框ID').val('账号')"); //账号密码

driver.ExecuteScript("return $('#密码输入框ID').val('密码')");

// 3.执行jQuery 获取 value 的值

var account = driver.ExecuteScript("return $('#帐号输入框ID').val()");

var pass = driver.ExecuteScript("return $('#密码输入框ID').val()");

driver.FindElement(By.Id("登录按钮ID")).Click(); //点击登录

Thread.Sleep(1000); // 给点时间加载网页

}

  八、cookie 问题

  以下方法用于演示如何获取cookies,仅供参考

<p>private static void GetCookie()

{

cookie = driver.Manage().Cookies; //主要方法

//显示初始Cookie的内容

Console.WriteLine("--------------------");

Console.WriteLine($"当前Cookie集合的数量:\t{cookie.AllCookies.Count}");

for (int i = 0; i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线