js 爬虫抓取网页数据(【VisualStudio】如何获取加载js渲染后的网页源码)
优采云 发布时间: 2021-10-24 05:12js 爬虫抓取网页数据(【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