5-爬虫-打码平台、打码平台自动登录打码平台、selenium爬取京东商品信息、scrapy介绍安装、scrapy目录结构

1 打码平台
1.1 案例
2 打码平台自动登录打码平台
3 selenium爬取京东商品信息
4 scrapy介绍安装
5 scrapy目录结构

1 打码平台

# 1 登录某些网站,会有验证码---》想自动破解
	-数字字母:python模块:ddddocr
    -计算题,成语题,滑块...:第三方打码平台,人工操作
    
    
# 2 打码平台
	-云打码,超级鹰
    
    
    
# 3 咱们破解网站登录的思路
	-使用selenium----》打开网站----》(不能解析出验证码地址)---》使用截图

1.1 超级鹰案例

import requests
from hashlib import md5


class ChaojiyingClient(object):
    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                          headers=self.headers)
        return r.json()

    def PostPic_base64(self, base64_str, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
            'file_base64': base64_str
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
    chaojiying = ChaojiyingClient('超级鹰账号', '超级鹰账号的密码', '903641')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1004))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    # print chaojiying.PostPic(base64_str, 1902)  #此处为传入 base64代码

2 打码平台自动登录打码平台

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image
from chaojiying import ChaojiyingClient

bro = webdriver.Chrome()
bro.maximize_window()

try:
    # 1 打开页面
    bro.get('https://www.chaojiying.com/user/login/')

    # 2 找到用户名,密码,验证码的输入框
    username = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')
    password = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
    code = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')
    time.sleep(2)
    username.send_keys('账号')
    time.sleep(2)
    password.send_keys('密码')

    # 3 验证码破解---》网页屏幕截图---》根据验证码图片的位置和大小,从网页截图中扣出验证码图片---》调用超级鹰--》完成破解---》填入
    # 网页截图
    bro.save_screenshot('main.png')
    # 找到img的大小和位置
    img = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img')
    location = img.location
    size = img.size
    print('大小是:', img.size)
    print('位置是:', img.location)
    # 获取图的 起始位置坐标  结束位置坐标
    img_tu = (
        int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']))
    # 使用pillow截图
    # #打开
    img = Image.open('./main.png')
    # 抠图
    fram = img.crop(img_tu)
    # 截出来的小图
    fram.save('code.png')

    # 调用超级鹰--》完成破解
    chaojiying = ChaojiyingClient('超级鹰账号', '密码', '903641')
    im = open('code.png', 'rb').read()
    res = chaojiying.PostPic(im, 1902)
    if res.get('err_no') == 0:
        code_img_text = res.get('pic_str')
        # 写入到验证码中
        code.send_keys(code_img_text)
        time.sleep(3)
        submit = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')
        submit.click()

    time.sleep(5)

except Exception as e:
    print(e)
finally:
    bro.close()

3 selenium爬取京东商品信息

import time
import json
from selenium import webdriver

bro = webdriver.Chrome()
bro.get('https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F')
bro.implicitly_wait(10)
bro.maximize_window()
input('需要手动扫码登录,登录成功后敲回车')

cookies = bro.get_cookies()
with open('jd.json', 'w', encoding='utf-8') as f:
    json.dump(cookies, f)

time.sleep(2)
bro.close()

import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.chrome.options import Options

def get_goods(bro):
    # 往下滑动屏幕
    bro.execute_script('scrollTo(0,document.documentElement.scrollHeight-600)')
    # 来到了商品结果页面,找到页面中所有类名叫 gl-item  的li
    li_list = bro.find_elements(By.CLASS_NAME, 'gl-item')
    for li in li_list:
        try:
            name = li.find_element(By.CSS_SELECTOR, 'div.p-name em').text
            price = li.find_element(By.CSS_SELECTOR, 'div.p-price i').text
            url = li.find_element(By.CSS_SELECTOR, 'div.p-img>a').get_attribute('href')
            # 如果不滑动屏幕---》图片先放在 data-lazy-img属性中,只有滑动到底部,图片加载完,src才有值
            img = li.find_element(By.CSS_SELECTOR, 'div.p-img>a>img').get_attribute('src')
            shop_name = li.find_element(By.CSS_SELECTOR, 'div.p-shop a').text
            print('''
            商品名字:%s
            商品价格:%s
            商品地址:%s
            图片:%s
            店铺名:%s

            ''' % (name, price, url, img, shop_name))
        except Exception as e:
            print(e)
            continue
    # 当前页爬取完成,点击下一页
    next = bro.find_element(By.PARTIAL_LINK_TEXT, '下一页')
    next.click()
    time.sleep(30)
    get_goods(bro)  # 递归调用自己---》 下一页会出现加载失败请情况----》一直在爬第一页

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(options=options)
# bro = webdriver.Chrome()
bro.get('https://www.jd.com')
bro.implicitly_wait(10)
bro.maximize_window()
print('写入cookie')
with open('jd.json', 'r') as f:
    cookies = json.load(f)
# 写到浏览器中
for item in cookies:
    bro.add_cookie(item)  # 如果是没登录的cookie,往里写会报错

# 刷新浏览器

bro.refresh()
time.sleep(1)
# 来到首页,找到搜索框
try:
    search = bro.find_element(By.ID, 'key')
    search.send_keys('卫生纸')
    time.sleep(2)

    # 敲回车
    search.send_keys(Keys.ENTER)
    # 获取商品信息
    get_goods(bro)

except Exception as e:
    print(e)
finally:
    bro.close()

4 scrapy介绍安装

# 爬虫模块:requests   bs4  selenium 

# 爬虫框架---》不是模块---》类似于django---》爬虫界的django(跟djagno非常像)

# 安装:pip3 install scrapy
	-mac,linux 非常好装
    -win:看人品:因为twisted装不上
        1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs
        3、pip3 install lxml
        4、pip3 install pyopenssl
        5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/
        6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
        7、执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
        8、pip3 install scrapy
        
# 装完后----》scripts文件夹下就会有scrapy可执行文件---》类似于(django-admin.exe)
	-创建项目,创建爬虫都用它
    
# 介绍
Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据或者通用的网络爬虫。

Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致如下


## 架构

# 1 爬虫(SPIDERS)
SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求
开发人员,主要在这写代码:设置爬取的地址,解析爬取完成的数据,继续爬取或者存储数据


#2  引擎(EGINE)
引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件

# 3 调度器(SCHEDULER)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

# 4 下载器(DOWLOADER)
用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的


# 5 项目管道(ITEM PIPLINES)
在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

# 6 下载器中间件(Downloader Middlewares)

位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,你可用该中间件做以下几件事

# 7 爬虫中间件(Spider Middlewares)
位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

在这里插入图片描述

在这里插入图片描述

5 scrapy目录结构

# https://www.cnblogs.com/robots.txt 爬虫协议


# 创建scrapy项目
	scrapy startproject scrapy_demo
# 使用pycharm打开
	
# 创建爬虫---》可以创建多个爬虫
	scrapy genspider 爬虫名 爬虫地址  # django创建app
    scrapy genspider cnblogs www.cnblogs.com  # 创建了爬取cnblogs的爬虫
    
    
# 运行爬虫:默认直接爬取www.cnblogs.com---》后续需要写代码实现
	scrapy crawl 爬虫名字
    scrapy crawl cnblogs 
    
    
    
    
# 目录结构
	scrapy_demo  #项目名
        scrapy_demo #包
            __init__.py
            spiders #包 ,所有爬虫文件,放在这里
                __init__.py
                cnblogs.py
            items.py # 一个个类,等同于djagno的models
            pipelines.py # 写如何存储,存到拿
            settings.py# 配置文件
            middlewares.py # 中间件:两种
        
     	scrapy.cfg	 # 上线用的

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS3 边框、圆角、背景

CSS3是最新的CSS标准。CSS3被拆分为“模块”。一些最重要的CSS3模块如下:选择器、盒模型、背景和边框、文字特效、2D/3D转换、动画、多列布局、用户界面。 一、CSS3边框: 用CSS3,可以创建圆角边框、添加阴影框,并作为边界的形象而…

【单目测距】单目相机测距(三)

文章目录 一、前言二、测距代码2.1、地面有坡度2.2、python代码2.2.1、旋转矩阵转角度2.2.2、角度转旋转矩阵2.2.3、三维旋转原理 (Rotation 原理)2.2.4、完整代码 2.3、c 代码 一、前言 上篇博客【单目测距】单目相机测距(二) 有讲到当相机不是理想状态…

17.复制字符串 ,包括\0

#include<stdio.h> #include <cstring>int main(){int len1,len2;char s1[44];char s2[33];scanf("%s",s1);scanf("%s",s2);len1strlen(s1)1;printf("先s1的字符长度为&#xff1a;%d\n",len1) ;strcpy(s1,s2) ;printf("复制字…

前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(三)

知者乐水&#xff0c;仁者乐山。 XMLHttpRequest AJAX原理 - XMLHttpRequest 前面与服务器交互使用的不是axios吗&#xff1f; ajax并不等于axios 我们使用的axios的内部&#xff0c;实际上对XHR对象/原理 的封装 为什么还要学习ajax&#xff1f; ①在一些静态网站项目中…

UPLOAD-LABS1

less1 (js验证) 我们上传PHP的发现不可以&#xff0c;只能是jpg&#xff0c;png&#xff0c;gif&#xff08;白名单限制了&#xff09; 我们可以直接去修改限制 在查看器中看到使用了onsubmit这个函数&#xff0c;触发了鼠标的单击事件&#xff0c;在表单提交后马上调用了re…

【Android】Dagger2 框架设计理念和使用方式详解

文章目录 Dagger 框架作用基本使用方法引入依赖创建 Object创建 Module创建 Component向 Activity 注入对象 Component 内部单例全局单例自定义 Scope关于单例作用域的理解注入多种同类型对象Component 依赖Component 继承传递 Activity Dagger 框架作用 这里&#xff0c;我们…

verilog 每日一练- 移位寄存器

module shift_1x64 (clk, shift,sr_in,sr_out,);input clk, shift;input sr_in;output sr_out;reg [63:0] sr;always(posedge clk)beginif (shift 1b1)beginsr[63:1] < sr[62:0];sr[0] < sr_in;endendassign sr_out sr[63];endmodule 这个Verilog模块 shift_1x64 实现了…

Leetcode—226.翻转二叉树【简单】

2023每日刷题&#xff08;二十四&#xff09; Leetcode—226.翻转二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

分享vmware和Oracle VM VirtualBox虚拟机的区别,简述哪一个更适合我?

VMware和Oracle VM VirtualBox虚拟机的区别主要体现在以下几个方面&#xff1a; 首先两种软件的安装使用教程如下&#xff1a; 1&#xff1a;VMware ESXI 安装使用教程 2&#xff1a;Oracle VM VirtualBox安装使用教程 商业模式&#xff1a;VMware是一家商业公司&#xff0c;而…

npm 下载包失败解决方案

1.【问题描述】使用 npm 下载vue项目依赖包时失败&#xff0c;版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令&#xff0c;用于在 Node.js 环境中使用 npm&#xff08;Node Package Manager&#xff09;安装包或模块。–force 参数表…

ubuntu18-recvfrom接收不到广播报文异常分析

目录 前言 一、UDP广播接收程序 二、异常原因分析 总结 前言 在ubuntu18.04系统中&#xff0c;编写udp接收程序发现接收不到广播报文&#xff0c;使用抓包工具tcpdump可以抓取到广播报文&#xff0c;在此对该现象分析解析如下文所示。 一、UDP广播接收程序 UDP广播接收程序如…

第三章 UI开发的点点滴滴

一、常用控件的使用方法 1.TextView android:gravity"center" 可选值&#xff1a;top、bottom、left、right、center等&#xff0c;可以用"|"来同时指定多个值&#xff0c;center表示文字在垂直和水平方向都居中 android:textSize 指定文字的大小&#…

双十一数码好物推荐,盘点那些错过等一年的好物!

双十一购物狂欢节马上到来&#xff0c;对于热爱数码产品的人来说&#xff0c;双十一无疑是一个绝佳的时机&#xff0c;因为许多知名品牌和零售商都会推出各种令人心动的数码好物促销活动。从佩戴服饰到大件智能装备&#xff0c;再到健康科技产品&#xff0c;市场上的选择多种多…

ASUS华硕灵耀X2 Duo UX481FA(FL,FZ)_UX4000F工厂模式原装出厂Windows10系统

下载链接&#xff1a;https://pan.baidu.com/s/1sRHKBOyc3zu1v0qw4dSASA?pwd7nb0 提取码&#xff1a;7nb0 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序所需要工具&#xff1a;16G或以上…

【mongoose】mongoose 基本使用

1. 连接数据库 // 1. 安装 mongoose // 2. 导入 mongoose const mongoose require(mongoose) // 3. 连接 mongodb 服务 mongoose.connect(mongodb://127.0.0.1:27017/xx_project) // 4. 设置回调 .on 一直重复连接 .once 只连接一次 mongoose.connection.on(open, () >…

【MySQL】一文学会所有MySQL基础知识以及基本面试题

文章目录 前言 目录 文章目录 前言 一、主流数据库以及如何登陆数据库 二、常用命令使用 三、SQL分类 3.1 存储引擎 四、创建数据库如何设置编码等问题 4.1操纵数据库 4.2操纵表 五、数据类型 六、表的约束 七、基本查询 八、函数 九、复合查询 十、表的内连和外连 十一、索引…

Flink之状态管理

Flink状态管理 状态概述状态分类 键控、按键分区状态概述值状态 ValueState列表状态 ListStateMap状态 MapState归约状态 ReducingState聚合状态 Aggregating State 算子状态概述列表状态 ListState联合列表状态 UnionListState广播状态 Broadcast State 状态有效期 (TTL)概述S…

JSON——数组语法

一段JSON可能是以 ”{“ 开头 也可能仅包含一段JSON数组 如下 [ { "name" : "hello,world"}, {"name" : "SB JSON”}&#xff0c; {“name” : "SB互联网房地产CNM“}&#xff0c; ] 瞧&#xff0c;蛋疼不...CJSON过来还是得搜下网…

持续集成交付CICD:安装Gitlab Runner(从节点)

目录 一、实验 1.选择Gitlab Runner版本 2.安装Gitlab Runner&#xff08;第一种方式&#xff1a;交互式安装&#xff09; 3.安装Gitlab Runner&#xff08;第二种方式&#xff1a;非交互式安装&#xff09; 二、问题 1.如何查看Gitlab版本 一、实验 1.选择Gitlab Runne…

『 MySQL数据库 』数据库基础之库的基本操作

文章目录 库的操作创建数据库字符集与校验集那么该如何查看当前数据库默认的字符集与校验规则?查看数据库所支持的字符集与校验集不同字符集(校验集)之间的区别 基本操作查看数据库显式数据库创建语句数据库的修改数据库的删除数据库的备份检查连接 库的操作 创建数据库 CRE…