首页 > 其他分享 >爬虫_04days

爬虫_04days

时间:2024-02-22 15:23:00浏览次数:29  
标签:xpath body 04days 爬虫 bro html import div

自动登录cnblogs--获取cookie

import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

# #### 绕过浏览器检测到 自动化软件控制
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(options=options)

# bro = webdriver.Chrome()
bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(10)
bro.maximize_window()



submit_btn = bro.find_element(By.LINK_TEXT, '登录')
submit_btn.click()
time.sleep(3)

# 找到用户名密码框,输入用户名密码
username=bro.find_element(By.ID,'mat-input-0')
password=bro.find_element(By.ID,'mat-input-1')
username.send_keys('')
time.sleep(2)
password.send_keys('')







time.sleep(2)
submit=bro.find_element(By.CSS_SELECTOR,'body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button > span.mat-button-wrapper')
time.sleep(2)
submit.click()

## 找到认证,点击一下
code=bro.find_element(By.ID,'rectBottom')
code.click()
time.sleep(2)
# submit.click()
time.sleep(5)

# 获取cookie---》登录后的cookie
cookies=bro.get_cookies()
# 保存到本地---》以json形式---》后期你们可以把它保存到redis中
with open('cnblogs.json','wt',encoding='utf-8') as f:
    json.dump(cookies,f)

time.sleep(5)
bro.close()

import time import json from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options # #### 绕过浏览器检测到 自动化软件控制 options = Options() options.add_argument("--disable-blink-features=AutomationControlled") # 去掉自动化控制 bro = webdriver.Chrome(options=options) # bro = webdriver.Chrome() bro.get('https://www.cnblogs.com/') bro.implicitly_wait(10) bro.maximize_window() # 读出cookie---》写入到浏览器中 with open('cnblogs.json', 'rt', encoding='utf-8') as f: cookies = json.load(f) for cookie in cookies: bro.add_cookie(cookie) time.sleep(2) bro.refresh() time.sleep(5) bro.close()

抽屉半自动点赞

# 1 使用selenium(半自动)登录到抽屉新热网站---》获取到cookie
-多个小号---》搭建cookie池
# 2 使用requests+cookie---》对文章进行点赞
-使用多个小号的cookie对同一篇文章点赞

import time
import json

import requests

from selenium import webdriver
from selenium.webdriver.common.by import By

bro = webdriver.Chrome()
bro.get('https://dig.chouti.com/')
bro.implicitly_wait(10)
bro.maximize_window()



#  找到登录按钮---点击

submit_btn = bro.find_element(By.ID, 'login_btn')
submit_btn.click()

# 找到用户名密码框--》输入用户名和密码
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')

submit = bro.find_element(By.CSS_SELECTOR,
                          'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div:nth-child(4) > button')
time.sleep(3)

submit.click()

# 后续可能会弹出验证码

input('等待,人工破解验证码--》完成后敲回车')

# 登录进去了
cookies = bro.get_cookies()
print(cookies)
# 把cookie保存到本地
with open('chouti.json', 'wt', encoding='utf-8') as f:
    json.dump(cookies, f)

time.sleep(5)
bro.close()


#### 使用requests---》点赞---》把当前页面所有的文章点一遍
from bs4 import BeautifulSoup

# 1 获取第一个的所有文章的id号
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
    'Referer':'https://dig.chouti.com/'
}
res = requests.get('https://dig.chouti.com/', headers=headers)

# print(res.text)
soup = BeautifulSoup(res.text, 'lxml')
div_list = soup.find_all(name='div', class_='link-item')

with open('chouti.json', 'rt', encoding='utf-8') as f:
    cookies = json.load(f)

#### 注意:requests模块需要的cookie 是dict结构---》并且它是 key:value 格式
requests_cookies = {}
for cookie in cookies:
    requests_cookies[cookie['name']] = cookie['value']

print('requests模块需要的cookie格式', requests_cookies)
for div in div_list:
    article_id = div.attrs.get('data-id')
    print(article_id)

    # 要带cookie
    data = {
        'linkId': article_id
    }
    res = requests.post('https://dig.chouti.com/link/vote', headers=headers, cookies=requests_cookies,data=data)
    print(res.text)

# 2 使用requests+id+cookie   点赞

xpath

# xpath:XML 路径语言。在xml中找标签的语法
-css选择器可以干这个事
# 语法格式如下(记住这几个)
1 标签名 # 找xml中所有这个标签
2 / # 只找一层]
3 // # 子子孙孙都会找
4 . # 从当前路径下
5 .. # 上一层
6 @属性名 # 找有这个属性的标签


# 看案例---》只需要理解--》

doc='''
<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html' id='id_a' name='lqz'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'  class='li'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
   <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
  </div>
 </body>
</html>
'''


from lxml import etree
html=etree.HTML(doc) # 加载字符串
# html=etree.parse('search.html',etree.HTMLParser()) # 加载文件


# 1 所有节点
# a=html.xpath('//*')
# a=html.xpath('/*')
# 2 指定节点(结果为列表)
# a=html.xpath('//head')

# 3 子节点,子孙节点
# a=html.xpath('//div/a')
# a=html.xpath('//body/a') #无数据
# a=html.xpath('//body//a')

# 4 父节点
# a=html.xpath('//body//a[@href="image1.html"]/..')
# a=html.xpath('//body//a[1]/..')  # 从1开始
# 也可以这样
# a=html.xpath('//body//a[1]/parent::*')  # 找父亲---》父亲可以是任意标签
# a=html.xpath('//body//a[1]/parent::div')  # 找父亲---》父亲可以是任意标签

# 5 属性匹配
# a=html.xpath('//a[@href="image1.html"]')

# 6 文本获取(记住)
# a=html.xpath('//body//a[@href="image1.html"]/text()')

# 7 属性获取(记住)
# a=html.xpath('//body//a/@href') # 拿所有a的href属性
# a=html.xpath('//body//a[1]/@href') # 从1开始
# # 注意从1 开始取(不是从0)
# a=html.xpath('//body//a[1]/@href')


# 8 属性多值匹配
#  a 标签有多个class类,直接匹配就不可以了,需要用contains
# a=html.xpath('//body//a[@class="li"]') # 有个类叫li的所有a标签,因为这个a有俩类
# a=html.xpath('//body//a[contains(@class,"li")]')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 9 多属性匹配
# a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
# a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')

# 10 按序选择
# a=html.xpath('//a[2]/text()')
# a=html.xpath('//a[2]/@href')
# 取最后一个
# a=html.xpath('//a[last()]/@href')
# 位置小于3的
# a=html.xpath('//a[position()<3]/@href')
# 倒数第二个
# a=html.xpath('//a[last()-2]/@href')

# 11 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
# a=html.xpath('//a/ancestor::*')
# # 获取祖先节点中的div
# a=html.xpath('//a/ancestor::html')

# attribute:属性值
# a=html.xpath('//a[1]/attribute::*')
# a=html.xpath('//a[1]/attribute::id')

# child:直接子节点
# a=html.xpath('//a[1]/child::*')
# a=html.xpath('//a[1]/child::img')
# descendant:所有子孙节点
# a=html.xpath('//a[6]/descendant::*')
# following:当前节点之后所有节点
# a=html.xpath('//a[1]/following::*')
# a=html.xpath('//a[1]/following::*[1]/@href')
# following-sibling:当前节点之后同级节点
# a=html.xpath('//a[1]/following-sibling::*')
# a=html.xpath('//a[1]/following-sibling::a')
# a=html.xpath('//a[1]/following-sibling::*[2]')
a=html.xpath('//a[1]/following-sibling::*[2]/@href')

print(a)




# //*[@id="cnblogs_post_body"]/p[9]/strong

动作链

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
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(3)
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对象后,对象有很多方法
        1 把标签1 拖动到标签2上
            actions.drag_and_drop(标签1,标签2) 
        2 一点点滑动某个标签
            actions.click_and_hold(标签1).perform()
            actions.move_by_offset(x,y) # 把标签1 滑动x轴和y轴的距离
        3 滑动某个标签,一些距离
            actions.drag_and_drop_by_offset(标签1,x,y)
    '''

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

    # 方式二:不同的动作链,每次移动的位移都不同
    ActionChains(driver).click_and_hold(sourse).perform()  # 鼠标点中源 标签 不松开
    distance=target.location['x']-sourse.location['x']
    track = 0
    while track < distance:
        ActionChains(driver).move_by_offset(xoffset=10, yoffset=0).perform()
        track += 10
    ActionChains(driver).release().perform()

    # 方式三:
    # actions = ActionChains(driver)
    # actions.drag_and_drop_by_offset(sourse,200,0).perform()

    time.sleep(5)

finally:
    driver.close()

打码平台

# 网站有验证码,验证码破解
-简单验证码:字母数字组合---》免费的就能破---》ddddocr
-https://www.jb51.net/article/249636.htm

-复杂的:收费---》打码平台--》花钱帮我们破解验证码
把验证码图片传给它--->它识别完--》返回结果---》根据复杂度收费
-超级鹰
-云打码

基本测试

class Chaojiying_Client(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 = Chaojiying_Client('306334678', 'lqz123', '903641')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('code.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    # print chaojiying.PostPic(base64_str, 1902)  #此处为传入 base64代码

自动登录超级鹰

import time

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

bro = webdriver.Chrome()
bro.get('https://www.chaojiying.com/user/login/')
bro.implicitly_wait(10)
bro.maximize_window()
# 1  截图屏幕
bro.save_screenshot('main.png')
# 2 找到用户名,密码,验证码输入框

username = bro.find_element(By.CSS_SELECTOR,
                            'body > div.wrapper_danye > div > div.content_login > div.login_form > form > p.login_form_item > 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.CSS_SELECTOR,
                        'body > div.wrapper_danye > div > div.content_login > div.login_form > form > p:nth-child(4) > input')

# 3 输入用户名,输入密码
username.send_keys('306334678')
password.send_keys('lqz123')

# 4 破解验证码---》从截图中,截取出验证码
img = bro.find_element(By.CSS_SELECTOR,
                       'body > div.wrapper_danye > div > div.content_login > div.login_form > form > div > img')
# 使用pillow---》根据坐标,扣除 验证码图片

# 找到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('code1.png')

# 调用超级鹰识别
# chaojiying = Chaojiying_Client('306334678', 'lqz123', '903641')  # 用户中心>>软件ID 生成一个替换 96001
# im = open('code1.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# real_code = chaojiying.PostPic(im, 1902)['pic_str']  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

###使用ddddocr试试
import ddddocr
ocr = ddddocr.DdddOcr(old=True,show_ad=False)
# 第一个验证截图保存:verification_code_1.png
with open("./code1.png", 'rb') as f:
    image = f.read()
real_code = ocr.classification(image)


code.send_keys(real_code)
time.sleep(5)

# 找到登录按钮,登录
submit = bro.find_element(By.CSS_SELECTOR,
                          'body > div.wrapper_danye > div > div.content_login > div.login_form > form > p:nth-child(5) > input')
submit.click()

time.sleep(10)
bro.close()

scrapy介绍和安装

# 爬虫框架
    -什么是框架:scrapy,djagno---》通过框架创建出一个项目
        -scrapy称之为爬虫界的django
    -什么是模块:requests,selenium,bs4
    
    
# 安装
    pip install scrapy #看人品--》99%都能装好--》在win上--》因为缺少东西
    
    # win 如果装不了,按这个步骤
        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、执行
            pip3 install Twisted
        8、pip3 install scrapy

        
    #在 D:\Python38\Scripts 路径下 会有scrapy可执行文件
        -它等同于,你安装了django--》多两个djagno-admin可执行文件
        
        
# 创建爬虫项目
    scrapy startproject myfirstscrapy # 等同于 djagno-admin startproject django01
    New Scrapy project 'myfirstscrapy', using template directory 'D:\Python38\Lib\site-packages\scrapy\templates\project', created in:
        D:\myfirstscrapy

    You can start your first spider with:
        cd myfirstscrapy
        scrapy genspider example example.com # 创建爬虫 等同于django的创建app
        
        
 # 使用pycharm打开项目

 

标签:xpath,body,04days,爬虫,bro,html,import,div
From: https://www.cnblogs.com/wzh366/p/18027423

相关文章

  • 爬虫简介
    爬虫分类:  通用爬虫:抓取系统重要组成部分,抓取的是一个整张页面的数据  聚焦爬虫:是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容  增量式爬虫:检测网站中数据更新的情况,指挥抓取网站中最新更新出来的数据爬虫的矛与盾:反爬机制  门户网站,可以通过制定相应......
  • 爬虫03_days
    selenium介绍#1由于requests不能执行js---》逐个分析ajax请求--》模拟发送获取数据 -使用requests爬取的数据很大概率跟在浏览器中看到的不一样-requests不能执行js#2seleniumselenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaS......
  • Scrapy爬虫框架
    一、安装Scrapypipinstallscrapy二、创建scrapy项目scrapystartprojectmy_spider三,创建爬虫文件scrapygenspiderexampleexample.com#example文件名称#example.com爬取网站地址#如:scrapygenspiderbaidubaidu.com出现下图就创建成功 四、运行刚才......
  • python 爬虫模板
    前言在我们写爬虫的时候,一般想要的数据都在详情页里面,一般代码进入详情页参数,需要首页里面寻找,所以爬这样的网站,需要定义一个模板我的模板如下: importrandomimporttimeimportrequestsfromauctionimportlogtoolfromauction.BaseCrawlerimportBaseCrawlercla......
  • python实战:用requests+做爬虫
    一,安装requests1,用pip安装(venv)liuhongdi@192news%pip3installrequests2,查看所安装库的版本:(venv)liuhongdi@192news%pip3showrequestsName:requestsVersion:2.31.0Summary:PythonHTTPforHumans.Home-page:https://requests.readthedocs.ioAu......
  • 爬虫_02days
    免费代理池搭建#代理有免费和收费代理#代理有http代理和https代理#匿名度 -高匿:隐藏访问者ip-透明:服务端能拿到访问者ip-作为后端,如何拿到使用代理人的ip -请求头中:x-forword-for-如果一个HTTP请求到达服务器之前,经过了三个代理Proxy1、Proxy2、Proxy3......
  • 爬虫——day01
    爬虫介绍爬虫是什么? -通过编程技术---》把互联网中的数据---》获取到---》数据清洗---》存到库中python:request,selenium---》app,小程序,网站---》xpaht,lxml---》mysql,redis,文件,excel,mongodb-通过编程语言---》模拟发送http请求---》获取数据---》解析--》入库......
  • 【60行代码解决】2024年最新版python爬虫有道翻译js逆向
    一、表单参数sign加密sign:c0f36866a9c650144ed5bac4eba532a7这种32位一般是MD5加密1.搜索sign:2.点击去分别在每个**sign:某某某**处打上断点结果在这个断点断住了3.原代码constu="fanyideskweb",d="webfanyi"functionj(e){returnc.a.createHash......
  • 第 8章 Python 爬虫框架 Scrapy(下)
    第8章Python爬虫框架Scrapy(下)8.1Scrapy对接Selenium有一种反爬虫策略就是通过JS动态加载数据,应对这种策略的两种方法如下:分析Ajax请求,找出请求接口的相关规则,直接去请求接口获取数据。使用Selenium模拟浏览器渲染后抓取页面内容。8.1.1如何对接单独使用Sc......
  • 爬虫案例
    多进程和多线程爬虫案例importos.pathimporttimefrommultiprocessingimportProcessfromthreadingimportThreadimportrequestsfromlxmlimportetreefromfake_useragentimportUserAgentclassBaseSpider(object):def__init__(self):self.url......