动作链(了解),xpath的使用,打码平台使用,scrapy介绍和安装,scrapy架构介绍,scrapy目录介绍,scrapy项目创建,爬虫创建,启动爬虫

1 抽屉半自动点赞

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import json
# 使用requests模块, 发送点赞请求
import requests

#
# bro = webdriver.Chrome()
# bro.get('https://dig.chouti.com/')
# bro.implicitly_wait(10)
# # bro.maximize_window() # 全屏
# try:
#     # 取出当前页面中所有的文章id
#     ids = []
#     id_list = bro.find_elements(By.CSS_SELECTOR, 'div.link-item')
#     for item in id_list:
#         ids.append(item.get_attribute('data-id'))
#
#     print(ids)
#
#     # login_btn=bro.find_element(By.CSS_SELECTOR,'#login_btn')
#     login_btn = bro.find_element(By.ID, 'login_btn')
#     bro.execute_script('arguments[0].click()', login_btn)  # 使用js点击
#     # login_btn.click()
#     time.sleep(1)
#     username = bro.find_element(By.CSS_SELECTOR,
#                                 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-body > div.form-item.login-item.clearfix.phone-item.mt24 > div.input-item.input-item-short.left.clearfix > input')
#     password = bro.find_element(By.CSS_SELECTOR,
#                                 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div.form-item.login-item.clearfix.mt24 > div > input.input.pwd-input.pwd-input-active.pwd-password-input')
#     username.send_keys('18953675221')
#     password.send_keys('lqz123')
#     time.sleep(3)
#     login_btn2 = bro.find_element(By.CSS_SELECTOR,
#                                   'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div:nth-child(4) > button')
#     login_btn2.click()
#     input('人工操作')
#     with open('chouti.json', 'w', encoding='utf-8') as f:
#         json.dump(bro.get_cookies(), f)
#
#     time.sleep(2)
#
#     # 使用requests点赞
#     header = {
#         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
#     }
#     with open('chouti.json', 'r', encoding='utf-8') as f:
#         cookie = {}
#         cookie_list = json.load(f)
#         for item in cookie_list:
#             cookie[item['name']] = item['value']
#             # {Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1:zqZgG2gcELxAevskCyAiB9m0YdTMFfrEHyHpqnH3uLyQBGCj38e8ZNNkVM4nXDmhKuCfjjQHcX8iCRefrMuAdxV8eSUR%2FmwUXMCcn9BtIMlfGLlENdR1QsrFzFZhLo2GREw%3D,}
#
#     print(cookie)
#     for item in ids:
#         res = requests.post('https://dig.chouti.com/link/vote',
#                             headers=header,
#                             data={
#                                 'linkId': item
#                             },
#                             cookies=cookie)
#         print(res.text)
#
# except Exception as e:
#     print(e)
#
# finally:
#     bro.close()


# 评论功能
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    'Referer': 'https://dig.chouti.com/',
}
with open('chouti.json', 'r', encoding='utf-8') as f:
    cookie = {}
    cookie_list = json.load(f)
    for item in cookie_list:
        cookie[item['name']] = item['value']
        # {Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1:zqZgG2gcELxAevskCyAiB9m0YdTMFfrEHyHpqnH3uLyQBGCj38e8ZNNkVM4nXDmhKuCfjjQHcX8iCRefrMuAdxV8eSUR%2FmwUXMCcn9BtIMlfGLlENdR1QsrFzFZhLo2GREw%3D,}

print(cookie)
res = requests.post('https://dig.chouti.com/comments/create', headers=header, cookies=cookie, data={
    'content': '写的真不好搞好',
    'linkId': '35860995',
    'parentId': 0,
    'pictureUrl': '',
    'subjectId': 4,
})
print(res.text)

2 动作链(了解)

# 模拟按住鼠标拖动的效果,或者是在某个标签上的某个位置点击的效果,主要用来做验证码的破解(滑动验证码)
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
driver.implicitly_wait(10)  # 使用隐式等待

driver.maximize_window()

try:
    driver.switch_to.frame('iframeResult') ##切换到iframeResult
    sourse=driver.find_element(By.ID,'draggable')
    target=driver.find_element(By.ID,'droppable')


    #方式一:基于同一个动作链串行执行
    # actions=ActionChains(driver) #拿到动作链对象
    # actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行

    actions=ActionChains(driver).click_and_hold(sourse)
    actions.drag_and_drop_by_offset(target,10,20)
    actions.perform()
    #方式二:不同的动作链,每次移动的位移都不同

    # ActionChains(driver).click_and_hold(sourse).perform()
    # distance = target.location['x'] - sourse.location['x']  # 两个控件的x轴的距离
    # track=0
    # while track < distance:
    #     ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()
    #     track+=2
    # # ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0).perform()
    # ActionChains(driver).release().perform()

    time.sleep(10)


finally:
    driver.close()


'''
总结:
    -ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()  滑块,滑动验证码的破解
    -actions.drag_and_drop_by_offset(target,10,20)  原来的12306的点选,cnblgs选出所有红绿灯的验证码
         actions=ActionChains(driver)
         actions.drag_and_drop_by_offset(target,10,20)

'''

# 12306 自动登录---》滑块显示不出来---》检测到咱们使用自动化测试软件控制了

3 xpath的使用

# 一般解析库都会有子的的搜索标签的方法,一般都会支持css和xpath
# XPath 是一门在 XML 文档中查找信息的语言

# 需要你记住的:
	-div   找div标签
    -/     找当前路径下的标签
    	- /div/a
    -//    找当前路径子子孙孙下的标签
    	-/div//a
    -.    表示当前路径
    -..   表示上一层
    	-./div/a
        -../div/a
    -@  表示取属性
    
    -//body//a[contains(@class,"li")]
    -//body//a[@href="image1.html"]
    -//a//text()
    -//a//@href
    
    
# 终极大招,复制
//*[@id="cnblogs_post_body"]/p[9]/strong

4 打码平台使用

# 验证码的破解
	-简单的数字字母组合可以使用图像识别(python 现成模块),成功率不高
    -使用第三方打码平台(破解验证码平台),花钱,把验证码图片给它,它给你识别完,返回给你
# 云打码,超级鹰
	306334678
    lqz123
from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image

bro = webdriver.Chrome()
bro.get('http://www.chaojiying.com/user/login/')
bro.maximize_window()

try:
    bro.save_screenshot('main.png')  # 把当前页面截图截图
    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(location)
    print(size)
    # 使用pillow扣除大图中的验证码
    img_tu = (
    int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']))
    # # 抠出验证码
    # #打开
    img = Image.open('./main.png')
    # 抠图
    fram = img.crop(img_tu)
    # 截出来的小图
    fram.save('code.png')
    from chaojiying import ChaojiyingClient

    chaojiying = ChaojiyingClient('306334678', 'lqz12345', '937234')
    im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))

except:
    pass
finally:
    bro.close()

5 scrapy介绍和安装

# requests,selenium,bs4(模块)--->专业爬虫:爬虫框架(scrapy),在固定位置写固定代码,就能完成爬虫的功能
# 安装:
	-pip3 install scrapy (mac,linux)
    -win:看人品
       1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs
        2、pip3 install lxml
        3、pip3 install pyopenssl
        4、下载并安装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
        
# Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫

6 scrapy架构介绍

# 框架---》架构
# 1 spiders:爬虫(咱们的代码)
# 2 engin :引擎(大总管)
# 3 scheduler:调度器(排队,谁先爬谁后爬,去重)
# 4 downloader:下载器(真正的负责发送http请求,获取数据,性能很高,基于twisted,性能很高的网络框架)
# 5 piplines:管道(保存数据)


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

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

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

# 爬虫(SPIDERS)
SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

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


# 下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
# 爬虫中间件(Spider Middlewares)
位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

img

7 scrapy目录介绍,scrapy项目创建,爬虫创建,启动爬虫

# scrapy是爬虫界的django
# 1 创建scrapy项目  ---》对比django
scrapy startproject myfirstscrapy

# 2 创建爬虫----》对比django创建app
scrapy genspider cnblogs cnblogs.com

# 目录介绍
firstscrapy         # 项目名
    firstscrapy     # 文件夹
        spiders     # 文件夹,一个个的爬虫
            cnblogs.py # 其中一个爬虫,重点写代码的地方(解析数据,发起请求)*****
        items.py    # 类比djagno的models,表模型--》类         ***
        middlewares.py # 中间件:爬虫中间件和下载中间件都在里面  ***
        pipelines.py   # 管道,做持久化需要在这写代码           ***
        settings.py    # 配置文件                             **
    scrapy.cfg    # 上线配置,开发阶段不用
    
    
# 启动爬虫,爬取数据
scrapy crawl 爬虫名字  --nolog

# 或者在项目路径下新建main.py--->右键运行
from scrapy.cmdline import execute
execute(['scrapy','crawl','cnblogs','--nolog'])
posted @ 2022-08-03 16:45  春游去动物园  阅读(66)  评论(0编辑  收藏  举报