爬虫知识--03

news2024/11/24 13:25:36

数据存mysql

import requests
from bs4 import BeautifulSoup
import pymysql

# 链接数据库pymysql
conn = pymysql.connect(
    user='root',
    password="JIAJIA",
    host='127.0.0.1',
    database='cnblogs',
    port=3306,
)
cursor = conn.cursor()
cursor = conn.cursor()

# 爬数据
res = requests.get('https://www.autohome.com.cn/news/1/#liststart')
# print(res.text)

# 引入解析库
soup = BeautifulSoup(res.text, 'html.parser')
ul_list = soup.find_all(name='ul', class_='article')
for ul in ul_list:
    li_list = ul.find_all(name='li')
    for li in li_list:
        h3 = li.find(name='h3')
        if h3:
            title = h3.text
            content = li.find('p').text
            url = 'https:' + li.find(name='a').attrs['href']
            img = li.find('img')['src']
            que = 'https:'
            if que not in img:
                img = que + img
            print('''
            文章标题:%s
            文章摘要:%s
            文章链接:%s
            文章图片:%s
            ''' % (title, content, url, img))

            # 把图片下载到本地
            img_res = requests.get(img)
            with open('./img/' + img.split('/')[-1], 'wb') as f:
                for line in img_res.iter_content():
                    f.write(line)

            # 存入数据库
            cursor.execute("INSERT INTO news (title,content,img,url) VALUES (%s,%s,%s,%s)",
                           args=[title, content, img, url])
            conn.commit()

上传cnblogs图片

import requests

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
    'Referer': 'https://i.cnblogs.com/ngsw-worker.js',
    'Cookie': '_ga_K9ZHTBGT3Z=GS1.2.1702215735.1.0.1702215735.0.0.0; __gads=ID=5a6b96e7dce231d8:T=1700637208:RT=1706056779:S=ALNI_MYRXZOHhBLLyQzpN1We4NUdfMGYQQ; __gpi=UID=00000c93f4b05ac4:T=1700637208:RT=1706056779:S=ALNI_MatObgQktmbem_0SXLJiayLziRINg; cto_bundle=m0Ggk19mR1BnZTB1dExyaHNvT01CN1dQM0RISU9WUUtIZXVsRW43OXpxJTJCM2ZRMEpncWxtRUpqUiUyRnJ4TkdJQTFlWWdJcWUlMkZub2I4ZWQ1M0w3bk9YRjFmSVozNFBZaFp1MkJEeDhMMjZCc1R4YTFLanNXVVhyNGZIOHJpUGpEREZUJTJGMG9pTmI3YURQWWQ3enlTVVVaY3RoNXNVQSUzRCUzRA; _ga_7DSFGJNPL4=GS1.1.1708417388.1.0.1708417388.0.0.0; Hm_lvt_866c9be12d4a814454792b1fd0fed295=1706056778,1708328454,1708521052; _ga=GA1.1.1528785063.1700619377; .AspNetCore.Antiforgery.b8-pDmTq1XM=CfDJ8DZoAyJmInJHoSwqM1IbzdQjW57WAADzO55EUBOrBFTDFAwXvmddFdsOwcd91uR9v1A23sMz6-hAGYwVrJHEH5c21hYY0xIfJ0-q3IBRlH4fIIoIFR2YMrT0AFNY6FN6LMlo2UEaQP9bnNUglQExnvY; .Cnblogs.AspNetCore.Cookies=CfDJ8DZoAyJmInJHoSwqM1IbzdTqIZnOOklAz_Oo1-ESSjFQVR0Sus_rZ18eCIcP-akb1YjYH-Uic23MF7u9RZHFjwmkhNbiUWC7xbFsYnzTcgu-nLsl5S6ZxcwEU3JGwjspeBFIqJ6kAA52NE1KnJKSkjvgKyfQL4FTAWpP6W7djbWxgFRsMY_eHqjRRS6L0-6dGePy8BFcwCNKm8yfVDN_wgKlsW6AztrWX9UB00sjnrBp0-QmK13o4qf8uLCw4eznsmlPWv_X1F6cNkp1Y6KODCznqgBcsOybycWBKS9vV2uIQ6-36t6HHxqNxL8ChBv73C3rTKfUtSMtLVYtBBE-goLnnqoVTfHqPAdhtj7USyVivYiEcBWAZrEScJ0kJy_9_yyMKiSIgjpOD7aQzzhD1U13tgnOO9ukBjSL-DH8BMODa7dcjfVlkm_8_osfLiwl7Y7oUTlxkIfIhTex2gyUsTIeWuvxRjOG-1kunQwCKpf6r2pZ_zmchTeWtg0hmR8FrHSH0JiT0GiQJZx7RBUZj3RmFfffkHanyu2KGXzMF_ekixBdCpzYAie5TkbQk1uHKoKrAMgdrGBWvRetLEcXfBoDtYgAmw3yDzLavMmVM1Ue; .CNBlogsCookie=4CC9FDFAB5122BA83534E90C476C1A6247EAF22D393555C1F9B6AA6247A9015208A126D736C7FD60A945836247262F06D289A6B0BF8B8B0E2981F8291311DD502E97F3DBD91ECD511D3EAF92566F14674A86FB9B; _ga_3Q0DVSGN10=GS1.1.1708521056.3.1.1708521352.28.0.0; Hm_lpvt_866c9be12d4a814454792b1fd0fed295=1708521353; _ga_M95P3TTWJZ=GS1.1.1708521052.31.1.1708521356.0.0.0; XSRF-TOKEN=CfDJ8DZoAyJmInJHoSwqM1IbzdRGjy4Kotcb_jOERQehTlGIpqZdhn-Zue6X3BLKyWSLj8cJCfqtCnXEFdWPWy1OLD64D1M7CWuHNCnJDZYsyExMi6EjFarOowjQTTuyzlGLPgG-6TnhkfDNGW1xsjqEuzDuINZ_HRV_fC0k_-nPEvGEU_bOuPqJXS3X6F7tGa0DwA; _ga_C2LFP3RFGH=GS1.1.1708521243.1.1.1708521421.0.0.0'
}

files = {
    'imageFile': ("55.png", open('55.png', 'rb'), "image/jpeg"),
    'host': 'www.cnblogs.com',
    'uploadType': 'Paste'
}

res = requests.post('https://upload.cnblogs.com/imageuploader/CorsUpload', headers=header,  files=files)
print(res.text)

selenium介绍

# 原由:由于requests不能执行js

             requests会逐个分析 ajax请求,模拟发送获取数据
             使用requests爬取的数据  很大概率跟在浏览器中看到的不一样
# 介绍:selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

# 本质:selenium是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果(跟咱们在浏览器看到的完全一致),支持多种浏览器

# 使用:
    1、确认好,我们要驱动什么浏览器,我们用谷歌
    2、下载一个浏览器驱动:驱动版本跟谷歌浏览器要对应
        122.0.6261.58 ----https://googlechromelabs.github.io/chrome-for-testing/
        win平台是:chromedriver.exe
    3、把驱动放在环境变量下,项目根路径下


    4、安装selenium 模块   pip install selenium
    5、写代码

from selenium import webdriver
import time

bro = webdriver.Chrome()     # 手动打开了浏览器
bro.get('https://www.baidu.com')    # 在浏览器中输入要访问的网址,并访问
time.sleep(5)
bro.close()    # 关闭浏览器

# 如果是:122.0.6261.57这个版本,安装包如下:
        https://storage.googleapis.com/chrome-for-testing-public/122.0.6261.57/win64/chromedriver-win64.zip

selenium模拟登录

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

bro = webdriver.Chrome()   # 手动打开了浏览器

bro.get('https://www.baidu.com')
# 设置等待 10s--->找标签,如果找不到--会最多等待10s钟
bro.implicitly_wait(10)

# 屏幕最大
bro.maximize_window()

# 选择器---》找标签
# submit_btn=bro.find_element(by=By.ID,value='s-top-loginbtn') # 通过id找的
submit_btn = bro.find_element(by=By.LINK_TEXT, value='登录')  # 通过a标签的文字找
submit_btn.click()   # 点击标签

# 点击短信登录---》睡3s钟
sms_submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__changeSmsCodeItem')
sms_submit.click()
time.sleep(3)

# 点击账号登录
username_submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__changePwdCodeItem')
username_submit.click()
time.sleep(3)

# 找到账号和密码---》输入
username = bro.find_element(By.ID, 'TANGRAM__PSP_11__userName')
username.send_keys('19856014525')  # 向输入框中写内容
time.sleep(1)

password = bro.find_element(By.ID, 'TANGRAM__PSP_11__password')
password.send_keys('19856014525')  # 向输入框中写内容
time.sleep(1)

# 点击接受---》点击登录
accept = bro.find_element(By.ID, 'TANGRAM__PSP_11__isAgree')
accept.click()
time.sleep(1)

submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__submit')
submit.click()
time.sleep(5)

bro.close()

无头浏览器

# 概念:无头浏览器是不加载页面也可以执行浏览器中的操作

# 过程:会去环境变量找驱动,找的过程比较慢,但是找到过一次,再运行就快了
# 这个是谷歌浏览器可执行文件的位置(可以不配, 环境变量中有)

        指定驱动的位置,具体需要参照文档

# options.binary_location = r"C:\Users\oldboy\AppData\Local\Google\Chrome\Application\chrome.exe"
# options.xx='D:\Python27\crawl_day03\chromedriver.exe'
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败



bro = webdriver.Chrome(options=options)
bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')

print('破解知乎登陆' in bro.page_source)
print(bro.page_source)

搜索标签

# 搜索标签:

By.ID    # 根据id号查找标签
By.NAME    # 根据name属性查找标签
By.TAG_NAME    # 根据标签查找标签
By.CLASS_NAME # 按类名找
By.LINK_TEXT   # a标签文字
By.PARTIAL_LINK_TEXT  # a标签文字,模糊匹配
By.CSS_SELECTOR # 按css选择器找
By.XPATH    #按xpath找

# 标签属性,位置,大小,文本:

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

bro = webdriver.Chrome()
bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html')
bro.implicitly_wait(10)
bro.maximize_window()
# bro.find_element() # 找一个
# bro.find_elements() # 找所有

# 1 按id找---找到点赞---》点击它--->使用id找
number=bro.find_element(By.ID,'digg_count')
number.click()

#2 按标签名找   找出页面中所有a标签  按标签名找
a_list=bro.find_elements(By.TAG_NAME,'a')
print(len(a_list))

# 3 按类名找
dig=bro.find_element(By.CLASS_NAME,'diggit')
dig.click()

# 4 按 a 标签 文字找 By.LINK_TEXT
res=bro.find_element(By.LINK_TEXT,'分布式爬虫')
print(res.text)
# print(res.get_attribute('href'))
# res.click()


# 5 a标签文字,模糊匹配  By.PARTIAL_LINK_TEXT
res=bro.find_element(By.PARTIAL_LINK_TEXT,'分布式')
print(res.text)
# print(res.get_attribute('href'))
# res.click()

# 6 css 解析
res=bro.find_element(By.CSS_SELECTOR,'a#cb_post_title_url>span')
res=bro.find_element(By.CSS_SELECTOR,'#cb_post_title_url > span')
print(res.get_attribute('role'))
print(res.text)

# 7 xpath解析--->不会xpath语法
res=bro.find_element(By.XPATH,'//*[@id="cb_post_title_url"]/span')
print(res.get_attribute('role'))
print(res.text)

time.sleep(5)
bro.close()

等待元素

# 1、隐士等待:等待标签加载好               

# 原由:在find_element 找标签时,代码执行很快,标签可能还没加载出来,取不到会报错

# 设置隐士等待:   bro.implicitly_wait(10)  

        加了这一句,当取标签时,如果标签没加载好,等待最多10s

        等标签加载出来后,找到了继续往后走

# 2、显示等待(不好用)
    每找一个标签,都要给它设置一次等待
# 以后,都在访问到某个地址后,加入这句话即可        bro.implicitly_wait(10)

执行js

bro.execute_script('js代码')

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

bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/category_1')
bro.implicitly_wait(10)
bro.maximize_window()
# 1 基本使用
bro.execute_script('alert("美女")')

# 2 打印出一些变量
bro.execute_script('console.log(urlMap)')
bro.execute_script('alert(JSON.stringify(urlMap))')


# 3 新建选项卡
bro.execute_script('open()')

# 4 滑动屏幕
bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')

# 5 获取当前访问地址
bro.execute_script('alert(location)')
bro.execute_script('location="http://www.baidu.com"')

# 6 打印cookie
bro.execute_script('alert(document.cookie)')


time.sleep(10)
bro.close()

选项卡

打开选项卡(通过执行js):bro.execute_script('open()')
切换到某个选项卡:bro.switch_to.window(bro.window_handles[1])
关闭选项卡:bro.close()
关闭浏览器:bro.quit()

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10)
print(bro.window_handles)
# 开启选项卡
bro.execute_script('window.open()')
# 获取出所有选项卡

bro.switch_to.window(bro.window_handles[1]) # 切换到第一个个选项卡
bro.get('http://www.taobao.com')

time.sleep(2)
bro.switch_to.window(bro.window_handles[0]) # 切换到某个选项卡
bro.get('http://www.baidu.com')

time.sleep(2)
bro.execute_script('window.open()')
bro.execute_script('window.open()')
bro.close() # 关闭选项卡

time.sleep(2)
bro.quit()  # 关闭页面

模拟浏览器前进后退

前进:bro.forward()

后退:bro.back()    

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10)

# 获取出所有选项卡
time.sleep(2)
bro.get('http://www.taobao.com')

time.sleep(2)

bro.get('http://www.baidu.com')
time.sleep(2)
bro.back()
time.sleep(2)
bro.back() # 前进
time.sleep(2)
bro.forward()  # 后退
bro.quit()  # 关闭页面

自动登录cnblogs

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

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


bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(10)    # 等待十秒
bro.maximize_window()  # 屏幕最大化
login_btn = bro.find_element(By.LINK_TEXT, '登录')
login_btn.click()     # selenium自动点击登录按钮

time.sleep(2)

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

submit_btn = 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')
# 验证码
code=bro.find_element(By.ID,'rectMask')
time.sleep(1)


username.send_keys('糖果爱上我125')
time.sleep(1)
password.send_keys('20020308Zjq.')
time.sleep(1)
submit_btn.click()  # 一种情况直接登录成功   一种情况会弹出验证码
code.click()
time.sleep(10)

# 让程序先停在这---》手动操作浏览器---》把验证码搞好---》程序再继续往下走
# 到现在,是登录成功的状态
# 取出cookie存起来
cookies = bro.get_cookies()
with open('cnblogs.json', 'w', encoding='utf-8') as f:
    json.dump(cookies, f)

time.sleep(2)
bro.close()

今日思维导图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MaxScale实现mysql8读写分离

MaxScale 实验环境 中间件192.168.150.24MaxScale 22.08.4主服务器192.168.150.21mysql 8.0.30从服务器192.168.150.22mysql 8.0.30从服务器192.168.150.23mysql 8.0.30 读写分离基于主从同步 1.先实现数据库主从同步 基于gtid的主从同步配置 主库配置 # tail -3 /etc/my.…

Encoder-decoder 与Decoder-only 模型之间的使用区别

承接上文:Transformer Encoder-Decoer 结构回顾 笔者以huggingface T5 transformer 对encoder-decoder 模型进行了简单的回顾。 由于笔者最近使用decoder-only模型时发现,其使用细节和encoder-decoder有着非常大的区别;而huggingface的接口为…

【vue】provide/inject

provide/ inject这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。 通途点来讲可以用来实现隔代传值,传统的props只能父传子,而 prov…

Vue3实现页面顶部进度条

Vue3页面增加进度条 新建进度条组件新建bar.ts导航守卫中使用 Vue3项目使用导航守卫给页面增加进度条 新建进度条组件 loadingBar.vue <template><div class"wraps"><div ref"bar" class"bar"></div></div> <…

2.21日学习打卡----初学Nginx(一)

2.21日学习打卡 目录: 2.21日学习打卡一. Nginx是什么&#xff1f;概述Nginx 五大应用场景HTTP服务器正向代理反向代理正向代理与反向代理的区别&#xff1a;负载均衡动静分离 为啥使用Nginx? 二.下载Nginx&#xff08;linux&#xff09;环境准备下载Nginx和安装NginxNginx源码…

Redis高性能原理

redis大家都知道拥有很高的性能&#xff0c;每秒可以支持上万个请求&#xff0c;这里探讨下它高性能的原理。单线程架构和io多路复用技术。 一&#xff0c;单线程架构 单线程架构指的是命令执行核心线程是单线程的&#xff0c;数据持久化、同步、异步删除是其他线程在跑的。re…

代码随想录算法刷题训练营day22

代码随想录算法刷题训练营day22&#xff1a;LeetCode(236)二叉树的最近公共祖先、LeetCode(235) 二叉搜索树的最近公共祖先、LeetCode(701)二叉搜索树中的插入操作、LeetCode(450)删除二叉搜索树中的节点 LeetCode(236)二叉树的最近公共祖先 题目 代码 /*** Definition for…

springmvc基于springboot 的音乐播放系统 _7sdu8

这就意味着音乐播放系统的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的ymj排行榜、ymj音乐资讯等功能。 此系统设计主要采用的是JAVA语言来进行开发&#xff0c;JSP技术、采用SSM框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

航空航天5G智能工厂数字孪生可视化平台,推进航空航天数字化转型

航空航天5G智能工厂数字孪生可视化平台&#xff0c;推进航空航天数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业关注的焦点。航空航天业作为高端制造业的代表&#xff0c;也在积极探索数字化转型之路。为了更好地推进航空航天数字化转型&#xff0c;一…

Java项目:27 基于SSM+JSP实现的大学校园兼职平台

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统介绍 基于SSMJSP实现的大学校园兼职平台分为前台与管理员两块 管理端分为8大模块&#xff0c;分别是用户管理、兼职管理、帖子管理、聊天…

Python-pdfplumber读取PDF内容

文章目录 前言一、pdfplumber模块1.1 pdfplumber的特点1.2 pdfplumber.PDF类1.3pdfplumber.Page类 二 pdfplumber的使用2.1 加载PDF2.2 pdfplumber.PDF 类2.3 pdfplumber.Page 类2.4 读取PDF2.5 读取PDF文档信息2.6 查看总页数2.7 查看总页数读取第一页的宽度&#xff0c;页高等…

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021 前言简介方法实现Emotion ReasonerResponse Generator实验结果示例总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Improv…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

2.22 Qt day3 多界面跳转+qss登录界面优化+发布软件+对话框

思维导图&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号…

Modern C++ std::variant的实现原理

1. 前言 std::variant是C17标准库引入的一种类型&#xff0c;用于安全地存储和访问多种类型中的一种。它类似于C语言中的联合体&#xff08;union&#xff09;&#xff0c;但功能更为强大。与联合体相比&#xff0c;std::variant具有类型安全性&#xff0c;可以判断当前存储的…

kali xrdp

Kali Linux 使用远程桌面连接——xrdp&xfce_kali xfce桌面-CSDN博客 Ubuntu/Debian/Kali xrdp远程桌面黑屏/空屏/无画面解决办法 - 知乎 (zhihu.com) sudo apt-get install xrdp -y sudo apt-get install xfce4 -ysudo systemctl enable xrdp --now systemctl status xrd…

PowerDesigner:pdm文件与sql文件互相转,数据库类型切换

PowerDesigner 依据sql文件生成pdm file——reverse engineer—— database 依据pdm文件导出sql 选中——database——generate database 切换库类型

利用nginx内部访问特性实现静态资源授权访问

在nginx中&#xff0c;将静态资源设为internal&#xff1b;然后将前端的静态资源地址改为指向后端&#xff0c;在后端的响应头部中写上静态资源地址。 近期客户对我们项目做安全性测评&#xff0c;暴露出一些安全性问题&#xff0c;其中一个是有些静态页面&#xff08;*.html&…