当前位置: 首页 > news >正文

寒假学习笔记2.10

一、实践练习
练习1:使用Selenium模拟登录豆瓣并获取个人主页信息
python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def douban_login(username, password):
driver = webdriver.Chrome()
driver.get("https://accounts.douban.com/passport/login")

# 切换到密码登录
time.sleep(2)
driver.find_element(By.CSS_SELECTOR, ".account-tab-account").click()# 输入账号密码
driver.find_element(By.ID, "username").send_keys(username)
driver.find_element(By.ID, "password").send_keys(password)# 点击登录
driver.find_element(By.CSS_SELECTOR, ".btn-account").click()
time.sleep(5)# 保存cookie
cookies = driver.get_cookies()
print("登录成功,cookies已获取")# 访问个人主页
driver.get("https://www.douban.com/people/xxx/")
html = driver.page_source
driver.quit()
return html

调用(请使用自己的账号密码)

douban_login("your_username", "your_password")

练习2:Scrapy爬取豆瓣电影Top250(使用Item Pipeline保存到JSON)
创建项目:scrapy startproject douban

定义Item(items.py):

python
import scrapy

class DoubanMovieItem(scrapy.Item):
title = scrapy.Field()
rating = scrapy.Field()
quote = scrapy.Field()
year = scrapy.Field()
编写爬虫(spiders/top250.py):

python
import scrapy
from douban.items import DoubanMovieItem

class Top250Spider(scrapy.Spider):
name = "top250"
allowed_domains = ["movie.douban.com"]
start_urls = [f"https://movie.douban.com/top250?start={i*25}" for i in range(10)]

def parse(self, response):for movie in response.css('.item'):item = DoubanMovieItem()item['title'] = movie.css('.title::text').get()item['rating'] = movie.css('.rating_num::text').get()item['quote'] = movie.css('.inq::text').get()info = movie.css('.bd p::text').getall()# 提取年份等yield item

配置Pipeline(pipelines.py):

python
import json

class DoubanPipeline:
def open_spider(self, spider):
self.file = open('movies.json', 'w', encoding='utf-8')

def close_spider(self, spider):self.file.close()def process_item(self, item, spider):line = json.dumps(dict(item), ensure_ascii=False) + '\n'self.file.write(line)return item

在settings.py中启用Pipeline:

python
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}
运行:scrapy crawl top250

练习3:使用代理IP池和User-Agent轮换
在Scrapy中集成中间件实现代理和UA轮换。

python

middlewares.py

import random
from fake_useragent import UserAgent

class RandomUserAgentMiddleware:
def init(self):
self.ua = UserAgent()

def process_request(self, request, spider):request.headers['User-Agent'] = self.ua.random

class ProxyMiddleware:
def process_request(self, request, spider):
proxies = ['http://123.123.123.123:8080', 'http://111.111.111.111:8888']
proxy = random.choice(proxies)
request.meta['proxy'] = proxy
在settings.py中启用中间件:

python
DOWNLOADER_MIDDLEWARES = {
'douban.middlewares.RandomUserAgentMiddleware': 400,
'douban.middlewares.ProxyMiddleware': 410,
}
二、遇到的问题与解决
问题:Selenium启动浏览器时报错“chromedriver”找不到

解决:下载对应Chrome版本的驱动,并将其所在目录添加到系统PATH,或在代码中显式指定路径。

问题:页面元素定位不到(NoSuchElementException)

解决:检查是否在iframe中(需先switch_to.frame),或增加等待时间,或使用更稳定的CSS/XPath。

问题:Scrapy爬取速度过快被ban

解决:在settings中设置DOWNLOAD_DELAY,启用RANDOMIZE_DOWNLOAD_DELAY,使用代理。

问题:Scrapy的parse方法中yield多个Request导致数据重复

解决:使用dont_filter=True避免去重,或调整去重策略。

问题:JavaScript动态内容在Scrapy中无法直接获取

解决:可以结合Selenium(但效率低),或分析Ajax接口直接请求JSON数据,或使用Splash等渲染服务。

三、学习总结
Selenium是处理动态页面的利器,但速度较慢,适合中小规模爬虫或需要交互的场景

反爬虫策略需要综合使用:User-Agent轮换、代理IP、请求延迟、Cookie模拟等

Scrapy框架提供了强大的异步爬取能力和模块化设计,适合大规模数据采集

通过Item、Pipeline、Middleware等组件,可以构建清晰可维护的爬虫项目

真实爬虫项目往往需要结合多种技术,分析网络请求、模拟浏览器、处理反爬等

http://www.jsqmd.com/news/390469/

相关文章:

  • 深入解析i2c_smbus_write_i2c_block_data()的32字节传输限制及应对策略
  • FLUX.1文生图实战:如何用ComfyUI打造专属AI画师
  • 微信小程序集成Qwen3-ASR-1.7B实战:语音输入功能开发指南
  • 寒假学习笔记2.9
  • Face3D.ai Pro商业案例:如何用AI加速3D内容生产
  • ChatGLM3-6B参数详解与环境配置:torch26+transformers 4.40.2黄金组合
  • PP-DocLayoutV3在C语言技术文档解析中的应用
  • SDXL-Turbo与LoRA结合:轻量级个性化模型训练
  • FLUX.1-dev-fp8-dit文生图GPU算力优化教程:FP8加速下显存占用降低40%实测
  • 一键部署Qwen3-ForcedAligner:语音对齐不求人
  • OFA图像英文描述模型与MySQL的深度集成方案
  • 极简AI绘画工具:MusePublic Art Studio 使用技巧分享
  • 一键部署DeepChat:体验高性能私有化AI对话服务
  • 瑜伽女孩图片生成不求人:雯雯的后宫-造相Z-Image-瑜伽女孩教程
  • 5分钟搞定!DeepChat本地AI助手部署教程
  • DeepSeek-OCR-2在Linux系统下的高效部署与优化指南
  • 3D建模小白必看:FaceRecon-3D极简入门指南
  • Qwen3-Reranker-4B与向量数据库集成:构建端到端检索系统
  • 一键部署:Fish Speech 1.5语音合成模型快速体验
  • DeOldify实战:无需代码,小白也能轻松玩转AI图像上色
  • GPUI 在 macOS 上编译问题排查指南
  • ssh端口转发
  • memU怎么处理记忆的
  • CVE-2018-3760
  • 缘分
  • MedRAGChecker:生物医学知识图谱增强大模型的声明级验证框架
  • [嵌入式系统-242]:AD转换电路常见问题与关键注意事项
  • 模型解释性实战:从黑盒到白盒的SHAP与LIME完全指南
  • [嵌入式系统-243]:为什么模拟地要与数字地分开,不分开的不良后果?
  • 信息论与编码篇---峰值信道比