整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

利用selenium,pyquery库抓取并处理京东

利用selenium,pyquery库抓取并处理京东上的图片

一,环境的搭建以及简单的工具介绍

    1.selenium,一个用于Web应用程序测试的工具。其特点是直接运行在浏览器中,就像真正的用户在操作一样。新版本selenium2集成了 Selenium 1.0 以及 WebDriver;

    2.webDriver作用如下:执行代码通过给Webdriver发送指令,让Webdriver知道想要做的操作,Webdriver再根据这些操作在浏览器界面上进行控制,例如查找页面元素、发送文本、实现事件点击等等;

    3.pyquery作用如下:此处用到的pyquery主要是一个对html代码数据进行提取的库,可以用来替代beautifulsoup和正则表达式对h5的提取。

    如何导入所需要的库:

      大部分教程中对于库的导入都是使用的pip install指令,但是当安装了多个python版本或者自己不知道自己python路径的时候,在python中可能无法调用下载的python库,此处直接使用pycharm进行  导入,示例如下:

      

      点击file->setting

    点击python interpreter右上角的加号,

     在界面中搜索想要的库,点击intsall package,便可以导入了。

二.使用selenium模拟浏览器访问京东页面。  

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from pyquery import PyQuery as pq

browser=webdriver.Chrome(ChromeDriverManager().install())   #打开Chrome 浏览器
wait=WebDriverWait(browser,10)
    try:
        browser.get('https://www.jd.com')
        input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#key")))   #对输入框进行指定
        sbmit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#search > div > div.form > button'))) #使用submit表示按钮
        input.send_keys('内容')               #输入内容
        sbmit.click()                 #点击按钮
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > em:nth-child(1) > b')))
        get_product()
        return total.text
    except TimeoutException:
        search()说明

   上方实现功能为打开京东并在搜索框中输入内容框所指示的部分然后进行搜索,如果代码有报错无法打开chrome,是因为没有使用webdriver_manager库,添加该库,其作用是自动联网下载chromedriver是的webdriver.chrome可以运行。

三. 模拟连续翻页,方便进行搜索

  函数代码如下: 

def next_page(page_number):
    try:
        input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > input')))
        submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > a')))
        input.clear()
        input.send_keys(page_number)
        submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_number)))
        get_product()
    except TimeoutException:
        next_page(page_number)



函数的功能为模拟在输入框中输入页码page_number,然后使用sunbmit.click语句吗,模拟点击翻页。

四.对数据进行抓取,并进行解析。
函数代码如下:
def get_product():
   # wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList .gl-warp .gl-item')))  #检测图片是否加载完成
    html=browser.page_source         #获取网页源代码
    doc=pq(html)
    items=doc('#J_goodsList .gl-warp .gl-item').items()        #获取所有的选择内容
    for item in items:
        product={
            'image': item.find('.p-img img').attr('src'),            #通过获取src属性来获取图片
            'price': item.find('.p-price').text(),               #获取文字内容
            'name': item.find('.p-name').text(),    #获取物品标题
            'shop': item.find('.p-shop').text()                   #获取商铺信息
            }
        print(product)

此处使用到的库为pyquery,通过selenium库对网页源代码进行获取,然后通过pyquery的find语句查找相应的元素装载到product中,最后进行打印。

最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可(免费分享哦)希望能对你有所帮助。

JavaScript中,您可以使用HTML5的<input type="file">元素来实现图片上传功能。

以下是一个简单的示例代码,演示如何在JavaScript中上传图片:

HTML部分:

<input type="file" id="uploadInput">
<button onclick="uploadImage()">上传图片</button>

JavaScript部分:

function uploadImage() {
  var fileInput=document.getElementById('uploadInput');
  var file=fileInput.files[0];

  if (file) {
    var formData=new FormData();
    formData.append('image', file);

    // 发送图片数据到服务器
    // 这里可以使用XMLHttpRequest或fetch等方法发送请求
    // 请根据您的需求选择适当的方法
    // 示例中使用XMLHttpRequest发送POST请求
    var xhr=new XMLHttpRequest();
    xhr.open('POST', '/upload', true);
    xhr.onload=function() {
      if (xhr.status===200) {
        // 上传成功
        console.log('图片上传成功');
      } else {
        // 上传失败
        console.log('图片上传失败');
      }
    };
    xhr.send(formData);
  }
}

API部分:

[HttpPost]
[RequestSizeLimit(5242880)]
 public async Task<APIResult> upload(IFormCollection collection)
 {

            APIResult rtn=new APIResult();

            if (collection==null)
            {
                rtn.code=-100;
                rtn.msg="图片列表为空";
                return rtn;
            }
            else
            {
                try
                {
                    string file_path="";
                    // 预处理 用户参数:用户指定子路径                   
                    string userPath=DateTime.Now.ToString("yyyy-MM-dd");
                    if (collection.ContainsKey("path"))
                    {
                        collection.TryGetValue("path", out Microsoft.Extensions.Primitives.StringValues val);
                        if (!val.Equals("undefined"))
                        {
                            userPath=val.ToString();
                        }
                    }

                    // 预处理 文件路径
                    // 注意:这里可能会根据不同的环境来 修改 路径前面是否需要添加 /
                    // 当发现上传不成功,目录无法创建时,可以尝试修改这里
                    file_path=$"upload/imgs/{userPath}/";
                    var uploadPath=Path.Combine(_webHostEnvironment.WebRootPath, file_path);
                    if (!Directory.Exists(uploadPath))
                    {
                        Directory.CreateDirectory(uploadPath);
                    }

                    // 处理文件
                    FormFileCollection filelist=(FormFileCollection)collection.Files;
                    foreach (IFormFile file in filelist)
                    {
                        // 保存文件到磁盘
                        string name=file.FileName;
                        string FilePath=Path.Combine(uploadPath, name);
                        string type=Path.GetExtension(name);
                        using (var stream=System.IO.File.Create(FilePath))
                        {
                            await file.CopyToAsync(stream);
                        };

                        // 保存文件信息到表
                        Sys_File f=new Sys_File();
                        f.code="image";
                        f.name=name;
                        f.file_type=type.Trim('.');
                        f.file_group=userPath;
                        f.file_path=$"/{file_path}{name}";
                        f.is_active=true;
                        f.memo="";
                        f.createTime=DateTime.Now;
                        using (var dbctx=DBHelper.db)
                        {
                            await dbctx.AddAsync(f);
                            await dbctx.SaveChangesAsync();
                        };
                        // 返回消息,包含文件路径
                        rtn.datas=$"/{file_path}{name}";
                        rtn.code=100;
                        rtn.msg="文件已保存!";
                    }
                }
                catch (Exception ex)
                {
                    rtn.code=-200;
                    rtn.msg="图片保存失败!";
                    Log4NetUnit.Instance.Log.Error("图片保存失败:" + ex.Message);
                }
                return rtn;
            }
        }


在这个示例中,我们首先在HTML中创建了一个<input type="file">元素,用于选择要上传的图片。

然后,我们在JavaScript中编写了一个uploadImage函数,该函数在点击"上传图片"按钮时触发。

uploadImage函数中,我们首先获取到<input>元素,并从中获取到用户选择的图片文件。

然后,我们创建一个FormData对象,并将图片文件添加到其中。

接下来,我们可以使用XMLHttpRequest或fetch等方法将图片数据发送到服务器。

在示例中,我们使用XMLHttpRequest发送了一个POST请求,将图片数据作为FormData发送到/upload端点。

您需要根据您的实际情况修改URL和请求方法。

当请求完成时,我们可以根据响应的状态码来判断上传是否成功。

在示例中,如果状态码为200,则表示上传成功,否则表示上传失败。

请注意,由于安全性限制,JavaScript无法直接访问用户的文件系统。

因此,用户必须手动选择要上传的文件。