Python3爬取某乎网站的图片,并保存到本地和数据库(亲测可用)

语言:Python3.7

数据库:mysql

需要导入的工具包,如下:

from urllib.request import urlopen    #注意这里的写法urllib不能直接写为import urllib要加上它的对象request
from bs4 import BeautifulSoup
import re
import time
import pymysql.cursors
import urllib.request

写入数据库需要创建表,代码如下:

CREATE TABLE imgtest(
     id INT PRIMARY KEY AUTO_INCREMENT,
     img LONGBLOB,    -- 图片字段
     content LONGTEXT  -- 文本字段
     
);

#==============实现爬取图片到本地文件夹====================

url = "https://www.zhihu.com/question/22918070"
html = urllib.request.urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(html,'html.parser')
print(soup.prettify())

#用Beautiful Soup结合正则表达式来提取包含所有图片链接(img标签中,class=**,以.jpg结尾的链接)的语句
links = soup.find_all('img',"origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$'))
print(links)

# 设置保存图片的路径,否则会保存到程序当前路径
path = r'D:\pcongfile\images'            #路径前的r是保持字符串原始值的意思,就是说不对其中的符号进行转义
for link in links:
    print(link.attrs['src'])
    #保存链接并命名,time.time()返回当前时间戳防止命名冲突
    urllib.request.urlretrieve(link.attrs['src'],path+'\%s.jpg' % time.time())  #使用request.urlretrieve直接将所有远程链接数据下载到本地
print('==========图片已写本地文件夹==========')

#==============实现爬取图片到本地数据库====================

#请求URL并使用UTF-8编码
resp = urlopen("https://www.zhihu.com/question/22918070").read().decode("utf-8")
#指定一个解析器
soup = BeautifulSoup(resp,"html.parser")
for ListUrl in soup.findAll('img',"origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$')):
    if not re.search("\.(jpg|JPG)$",ListUrl["src"]): #如果不是已jpg或者JPG结尾的才输出
        print(ListUrl.string,"<-------->","https://www.zhihu.com/question/22918070"+ListUrl["src"])

    #获取数据库链接  charset='utf8mb4'
    conn = pymysql.connect(host='localhost', user='root', password='123', db='pytest',port=3306)
    try:
        #获取内容
        with conn.cursor() as cursor:
            sql="insert into`imgtest`(`img`,`content`)values(%s,%s)"
            #执行sql
            cursor.execute(sql,(ListUrl.get_text(),"https://en.wikipedia.org"+ListUrl["src"]))
            conn.commit()  #提交
    finally:
        conn.close()
print('==========图片已写入数据库==========')

本地文件夹效果图:

数据库写入效果:

 

<think>我们被要求使用Python当前已打开的网站爬取网站的cookie。根据引用[2]引用[5],我们知道可以使用`requests`库处理cookie,但这里需要检当前浏览器打开的网站,因此我们需要与浏览器交互。 然而,引用[2]中提到了使用`requests.session()`来保持cookie,但这适用于模拟登录,而不是直接从浏览器获取已打开的网站cookie。同样,引用[5]提到了带cookie爬取,但也是基于程序自己管理的cookie。 实际上,要获取当前浏览器打开的网站cookie,我们需要访问浏览器的数据。这通常通过浏览器提供的扩展API(如Chrome扩展)或读取浏览器的cookie储文件(如Chrome的Cookies数据库)来实现。但是,由于不同浏览器操作系统的差异,以及安全限制,直接读取其他进程的cookie可能很困难。 另一种方法是使用浏览器自动化工具,如Selenium,它可以控制浏览器获取当前打开的URLcookie。引用[2]中提到了使用sessioncookie,但未涉及Selenium获取当前打开的网站。不过,引用[2]的标题提到了“selenium实现网站登录”,所以我们知道用户有Selenium的引用。 因此,我们可以使用Selenium来打开浏览器(比如Chrome),然后获取当前打开的标签页的URLcookie。但是,注意:Selenium通常启动一个新的浏览器实例,而不是连接到现有的浏览器会话。要连接已打开的浏览器,需要特定的配置。 对于Chrome,我们可以使用调试模式启动浏览器,然后让Selenium连接该实例。步骤如下: 1. 以调试模式启动Chrome(需要先关闭所有Chrome实例): 在命令行中执行:`chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\ChromeProfile"` (注意:路径可以自定义,端口也可以自定义) 2. 然后,在Python中使用Selenium连接已打开的浏览器实例: 但是,用户要求检当前已打开的网站,这意味着浏览器可能已经打开,而没有以调试模式启动。因此,我们需要用户先以调试模式启动浏览器,或者我们只能控制由Selenium启动的浏览器实例。 考虑到实际情况,我们可能无法直接获取任意已打开浏览器标签页的cookie(因为安全限制),除非该浏览器是我们以调试模式启动的。 因此,我们可以提供两种方案: 方案一:使用Selenium启动一个新的浏览器实例,然后让用户在这个实例中打开网站,然后我们获取cookie。 方案二:连接用户已经以调试模式打开的浏览器实例(需要用户配合)。 这里,我们采用方案二,因为用户要求检“当前已打开的网站”。但需要用户提前以调试模式启动浏览器。 步骤: 1. 确保用户已经以调试模式启动了浏览器(例如Chrome)。 2. 使用Selenium连接到该浏览器实例。 3. 获取当前激活标签页的URLcookie。 注意:这种方法只能获取到同一个用户数据目录下的浏览器实例,且必须是同一个端口。 代码示例: 首先,确保你已经安装了Selenium对应浏览器的驱动(如ChromeDriver)。 安装Selenium:`pip install selenium` 然后,下载与你的Chrome浏览器版本匹配的ChromeDriver,将其放在PATH路径中。 以下是代码: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置Chrome选项 chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 连接到已打开的浏览器 driver = webdriver.Chrome(options=chrome_options) # 获取当前标签页的URL current_url = driver.current_url print("当前URL:", current_url) # 获取当前页面的所有cookie cookies = driver.get_cookies() print("Cookies:") for cookie in cookies: print(cookie) # 关闭连接(注意:这不会关闭浏览器) driver.quit() ``` 注意:在运行上述代码前,请确保你已经以调试模式启动了Chrome浏览器(使用上面提到的命令行参数),且打开了你想获取cookie的网站。 但是,用户可能同时打开多个标签页,上述代码只能获取当前激活的标签页(即Selenium默认控制的标签页)。如果需要获取所有标签页,可以尝试使用以下方法: ```python # 获取所有窗口句柄 all_handles = driver.window_handles for handle in all_handles: driver.switch_to.window(handle) current_url = driver.current_url cookies = driver.get_cookies() print(f"标签页: {current_url}") print("Cookies:", cookies) ``` 然而,请注意,获取其他网站的cookie可能涉及隐私安全问题,请确保你有权访问这些网站且遵守相关法律法规网站的使用条款。 另外,引用[1]提到了处理反爬机制,而引用[4]提到了爬取视频,这些引用可能不直接相关,但我们可以提醒用户注意。 因此,完整的步骤是: 1. 用户以调试模式启动浏览器(保持运行)。 2. 用户手动打开需要爬取cookie的网站(可能需要登录,以便生成cookie)。 3. 运行上述Python代码,连接浏览器获取cookie。 注意事项: - 这种方法需要用户提前设置浏览器,且只能获取同一浏览器实例(同一个用户数据目录)下的标签页。 - 获取的cookie可以用于后续的爬虫请求(如使用requests库),但请注意cookie的时效性。 - 使用调试模式在安全风险,因为其他程序也可以连接控制浏览器,所以使用完毕后应关闭调试模式。 最后,我们可以将获取的cookie保存,以便在后续请求中使用。例如,我们可以将cookie转换成requests库可用的字典格式: ```python # 将Selenium格式的cookie转换为requests库可用的字典 cookies_dict = {} for cookie in cookies: cookies_dict[cookie[&#39;name&#39;]] = cookie[&#39;value&#39;] # 然后使用requests发送请求 import requests response = requests.get(current_url, cookies=cookies_dict) ``` 但是,请注意,有些网站除了cookie还会检查其他信息(如User-Agent),所以最好也设置请求头。 总结:我们使用Selenium连接到以调试模式打开的Chrome浏览器实例,然后获取当前激活标签页(或所有标签页)的URLcookie。 如果用户不想使用调试模式,或者无法重新启动浏览器,那么可能需要考虑其他方法,如使用浏览器扩展导出cookie,然后由Python读取。但这超出了当前问题的范围。 相关问题: 1. 如何以调试模式启动Chrome浏览器? 2. 如何将Selenium获取的cookie用于requests库? 3. 除了Chrome,如何连接其他浏览器(如Firefox)? 4. 如何避免在爬取cookie时触发网站的反爬机制? 请根据用户的具体情况选择合适的方法。</think>### Python当前浏览器打开的网站爬取Cookie 要实现检当前浏览器打开的网站爬取Cookie,可以使用以下两种主流方法: --- ### 方法一:使用Selenium连接已打开的浏览器 此方法通过调试端口连接已运行的浏览器实例,直接获取活动标签页的Cookie。 #### 实现步骤: 1. **启动浏览器时开启调试模式**(以Chrome为例): ```bash chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\ChromeDebug" ``` 2. **Python代码连接浏览器获取Cookie**: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置调试端口连接 chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 连接已打开的浏览器 driver = webdriver.Chrome(options=chrome_options) # 获取当前标签页的URL current_url = driver.current_url print(f"当前访问的网站: {current_url}") # 获取当前页面的所有Cookie cookies = driver.get_cookies() print("获取到的Cookie:") for cookie in cookies: print(f"{cookie[&#39;name&#39;]}: {cookie[&#39;value&#39;]}") # 将Cookie转为字典格式(用于requests) cookies_dict = {c[&#39;name&#39;]: c[&#39;value&#39;] for c in cookies} # 示例:使用requests访问受保护页面 import requests headers = {"User-Agent": "Mozilla/5.0"} response = requests.get(current_url, cookies=cookies_dict, headers=headers) print(f"页面状态码: {response.status_code}") # 关闭连接(不影响原浏览器) driver.quit() ``` #### 关键点说明: 1. `--remote-debugging-port`:指定调试端口(默认9222) 2. `--user-data-dir`:使用独立用户目录避免影响正常浏览 3. `driver.get_cookies()`:获取当前域名的完整Cookie列表 4. Cookie字典转换:可直接用于requests等库[^2] --- ### 方法二:通过浏览器Cookie文件直接读取 直接解析浏览器储的Cookie文件(无需开启调试模式)。 #### 实现步骤(以Chrome为例): ```python import sqlite3 import os from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import keyring # 获取Chrome Cookie文件路径 cookie_path = os.path.expanduser("~\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Network\\Cookies") # 解密Cookie的密钥 encryption_key = keyring.get_password( "Chrome Safe Storage", "Chrome" ).encode("utf-16le")[5:] # 移除DPAPI前缀 # 连接Cookie数据库 conn = sqlite3.connect(cookie_path) cursor = conn.cursor() cursor.execute("SELECT host_key, name, encrypted_value FROM cookies") # 解密提取Cookie decrypted_cookies = [] for host, name, encrypted_value in cursor.fetchall(): if encrypted_value[:3] == b"v10": # Chrome v80+加密格式 nonce, ciphertext = encrypted_value[3:15], encrypted_value[15:] cipher = Cipher(algorithms.AES(encryption_key), modes.GCM(nonce), backend=default_backend()) decryptor = cipher.decryptor() value = decryptor.update(ciphertext)[:-16].decode() # 移除认证标签 decrypted_cookies.append((host, name, value)) # 输出当前活跃站点的Cookie for host, name, value in decrypted_cookies: if "example.com" in host: # 替换为目标域名 print(f"{name}: {value}") ``` #### 注意事项: 1. **权限问题**:需要以管理员权限运行脚本 2. **浏览器版本**: - Chrome v80+ 使用AES-GCM加密 - 旧版本可能使用DPAPI(Windows)或Keychain(Mac) 3. **跨平台差异**: - Windows:Cookie路径在`AppData/Local/...` - macOS:`~/Library/Application Support/Google/Chrome/...` - Linux:`~/.config/google-chrome/...` --- ### 常见问题解决 1. **连接拒绝错误**: - 确保浏览器以调试模式启动 - 关闭所有浏览器进程后重新执行启动命令 2. **Cookie解密失败**: ```python # 尝试旧版Chrome解密方式(DPAPI) if sys.platform == "win32": import win32crypt value = win32crypt.CryptUnprotectData(encrypted_value)[1].decode() ``` 3. **无头模式获取Cookie**: ```python options = webdriver.ChromeOptions() options.add_argument("--headless") # 无头模式 driver = webdriver.Chrome(options=options) ``` --- ### 应用场景示例 1. 自动化试登录状态 2. 爬取需要登录的网站(如社交媒体) 3. 会话保持型数据采集 4. 单点登录(SSO)系统集成[^5] ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blogfish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值