c# 利用cef3抓取京东关键词商品列表,以手机为例

利用c# 的cef3 模拟浏览器操作,抓取京东商城关键词商品列表

获取商品标题,商品id,商品链接,商品价格

 public partial class Form1 : Form
    {
        public ChromiumWebBrowser browser { get; set; }
        public string key = "手机";  //抓取的关键词
        string jdTab="综合";     //选择排序
        int goTab = 0;        //判断是否已排序
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            browser = new ChromiumWebBrowser("https://www.jd.com/"); //初始化浏览器地址
            this.Controls.Add(browser);
            browser.FrameLoadEnd += Web_FrameLoadEnd;  //设置监听,当浏览器加载完毕
        }
        private async void Web_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            Debug.WriteLine("进入页面:" + e.Url);
            //MessageBox.Show(e.Url.ToString());
            if (e.Url.Contains("https://www.jd.com/"))  //进入主页时
{
// 设置关键词,点击搜索 await browser.GetMainFrame().EvaluateScriptAsync(" $('#key').focus()"); await browser.GetMainFrame().EvaluateScriptAsync(" $('#key').val('" + key + "')"); await browser.GetMainFrame().EvaluateScriptAsync(" $('.button').click()"); } else if (e.Url.Contains("https://passport.jd.com/uc/login")) { //京东反爬页面,跳回主页,重新搜索 browser.Load("https://www.jd.com/"); } else if (e.Url.Contains("Search?")) { string url = ""; string title = ""; string price = ""; string code = ""; string searchResult = ""; //判断该关键词是否有效 await browser.GetMainFrame().EvaluateScriptAsync("(function(){ return $('.ns-content').text();})()").ContinueWith(x => { try { searchResult += x.Result.Result.ToString(); } catch (NullReferenceException s) { } }); await browser.GetMainFrame().EvaluateScriptAsync("(function(){ return $('.check-error').text();})()").ContinueWith(x => { try { searchResult += x.Result.Result.ToString(); } catch (NullReferenceException s) { } }); Debug.WriteLine("searchResult:" + searchResult); if (!searchResult.Contains("没有") && !searchResult.Contains("仍然搜索") && !searchResult.Contains("点击查看")) //当页面字段不包含这些字样时,关键词搜索有效 {
            //选择排序,并将标识置为1
switch (jdTab) { case "综合": await browser.GetMainFrame().EvaluateScriptAsync("$('.f-sort a')[0].click()"); goTab = 1; break; case "销量": await browser.GetMainFrame().EvaluateScriptAsync("$('.f-sort a')[1].click()"); goTab = 1; break; case "价格": await browser.GetMainFrame().EvaluateScriptAsync("$('.f-sort a')[4].click()"); goTab = 1; break; case "评论数": await browser.GetMainFrame().EvaluateScriptAsync("$('.f-sort a')[2].click()"); goTab = 1; break; } Thread.Sleep(2000); browser.ExecuteScriptAsync(" scrollTo(0, document.body.scrollHeight)"); Thread.Sleep(3000); int p = 0; //数据丢失标志 int max = 0;  //商品总数 Thread.Sleep(500); await browser.GetMainFrame().EvaluateScriptAsync("(function(){ return $('.gl-item').length})()").ContinueWith(x => { try { max = int.Parse(x.Result.Result.ToString()); } catch (NullReferenceException s) { } }); for (int index = 0; index <= max; index++) { await browser.GetMainFrame().EvaluateScriptAsync("(function(){ return $('.gl-item .p-name a')[" + index.ToString() + "].href})()").ContinueWith(x => { try { url = x.Result.Result.ToString(); code = "JD" + Regex.Replace(url, @"[^\d]*", ""); } catch (Exception) { p = 1; } }); await browser.GetMainFrame().EvaluateScriptAsync("(function(){ return $('.gl-item .p-name em')[" + index.ToString() + "].innerText})()").ContinueWith(x => { try { title = x.Result.Result.ToString().Replace("\n",""); } catch (Exception) { p = 1; } }); await browser.GetMainFrame().EvaluateScriptAsync("(function(){ return $('.gl-item .p-price strong')[" + index.ToString() + "].innerText.replace('¥','')})()").ContinueWith(x => { try { price = x.Result.Result.ToString(); } catch (Exception) { p = 1; } }); if (p == 0) { Debug.WriteLine("url:" + url + " title=" + title + " code=" + code + " price=" + price); } } } else { Debug.WriteLine("没有找到词:" + key); } } } }

抓取结果:

 

转载于:https://www.cnblogs.com/yhood/p/11534409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CefSharp是一个基于Chromium Embedded Framework的.NET封装库,它允许开发者在.NET应用程序中嵌入HTML5内容。如果你想要劫持CefSharp来实现一些自定义功能,可以尝试以下步骤: 1. 在你的C#项目中安装CefSharp库,可以通过NuGet包管理器来完成。 2. 创建一个继承自CefSharp.WinForms.ChromiumWebBrowser的类,重写OnAfterCreated方法。 3. 在OnAfterCreated方法中获取当前的Browser对象,并通过Browser对象的GetHost方法获取Host对象。 4. 在Host对象中注册一个IRequestHandler实,该实可以拦截和处理浏览器请求。 5. 在IRequestHandler实中实现自定义的处理逻辑,如修改请求参数、注入JavaScript代码等。 下面是一个简单的示代码: ```csharp using CefSharp; using CefSharp.WinForms; class MyBrowser : ChromiumWebBrowser { protected override void OnAfterCreated(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser) { var host = browser.GetHost(); var requestHandler = new MyRequestHandler(); host.SetRequestHandler(requestHandler); } } class MyRequestHandler : IRequestHandler { bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect) { // 在这里可以修改请求参数 return false; } void IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) { // 在这里可以处理响应数据 } } ``` 需要注意的是,在实现自定义的IRequestHandler时,还可以覆盖其它方法来实现更丰富的功能,如OnBeforeResourceLoad、OnResourceLoadComplete等方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值