爬虫知识--03

数据存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.textcontent = li.find('p').texturl = 'https:' + li.find(name='a').attrs['href']img = li.find('img')['src']que = 'https:'if que not in img:img = que + imgprint('''文章标题:%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 requestsheader = {'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 timebro = 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 Bybro = 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 Optionsoptions = 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 Bybro = 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 Bybro = 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.hqwc.cn/news/486526.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年阿里云新用户购买云服务器优惠活动整理和续费折扣

2024阿里云服务器优惠活动政策整理,轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年,云服务器4核16G10M带宽26元1个月、149元半年,阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价,企业用户2核4G5M带宽199元一年&#x…

华清远见作业第四十一天——Qt(第三天)

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

C++容器map和set使用

map和set使用 mapmap的使用map的基本功能map的pair介绍map的[ ]介绍 map map是一种关联式容器&#xff0c;map的作用是将key和value一一对应的绑定在一起。用一个结构体pair将他们组合。 map的使用 map的三种插入模式 map<string, string> dist;// 插入方法1 显示构造…

C++力扣题目 647--回文子串 516--最长回文子序列

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…

HTML5新婚、年会、各种聚会的现场抽奖活动(附源码)

文章目录 1.抽奖平台设计来源1.1 主界面效果1.2 抽奖效果1.3 中奖效果 2.效果和源码配置2.1 动态效果2.2 人员信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

数字滚动实现

介绍 vue-countup-v3 插件是一个基于 Vue3 的数字动画插件&#xff0c;用于在网站或应用程序中创建带有数字动画效果的计数器。通过该插件&#xff0c;我们可以轻松地实现数字的递增或递减动画&#xff0c;并自定义其样式和动画效果。该插件可以用于许多场景&#xff0c;例如展…

小程序生命周期解析(从概念、启动、运行、销毁到生命周期事件及场景的全面解析)

引言 在当今移动应用激烈竞争的时代&#xff0c;小程序作为一种轻量级、高效便捷的移动应用形式&#xff0c;逐渐成为用户和开发者的热门选择。小程序不仅以其小巧灵活的体积受到用户喜爱&#xff0c;更因为无需安装、即点即用的特性在移动应用领域取得了广泛的普及。随着小程…

MySQL运维实战(7.2) MySQL复制server_id相关问题

作者&#xff1a;俊达 主库server_id没有设置 主库没有设置server_id Got fatal error 1236 from master when reading data from binary log: Misconfigured master - server_id was not set主库查看server_id mysql> show variables like server_id; ----------------…

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增 数据源平台:用友NC65 用友NC是为集团与行业企业提供的全线管理软件产品&#xff0c;由亚太本土最大的企业管理软件提供商用友公司研发提供&#xff0c;用友NC率先采用J2EE架构和先进开放的集团级开发平台UAP&#xff0…

【MATLAB源码-第144期】基于matlab的蝴蝶优化算法(BOA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 ​蝴蝶优化算法&#xff08;Butterfly Optimization Algorithm, BOA&#xff09;是基于蝴蝶觅食行为的一种新颖的群体智能算法。它通过模拟蝴蝶个体在寻找食物过程中的嗅觉导向行为以及随机飞行行为&#xff0c;来探索解空间…

链表之“无头单向非循环链表”

目录 ​编辑 1.顺序表的问题及思考 2.链表 2.1链表的概念及结构 2.2无头单向非循环链表的实现 1.创建结构体 2.单链表打印 3.动态申请一个节点 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 8.单链表在pos位置之前插入x 9.单链表删除pos位…

入门Web自动化测试之Selenium+Python基础方法封装

之前我们讲过元素定位的配置管理&#xff0c;这一篇我们来学习封装内容。 封装 既然选择了Python这门语言来实现Web自动化&#xff0c;那我们就不得不讲到一个重要的概念&#xff0c;那就是面向对象编程理念中的封装。 就字面意思来理解的话&#xff0c;就像是把各种物品放入…