scrapy-使用
1、scrapy框架项目实现流程
创建一个scrapy项目:scrapy startproject mySpider
生成一个爬虫:scrapy genspider itcast "itcast.cn"
提取数据:完善spider,使用xpath等方面
保存数据:pipeline中保存数据
2、创建一个scrapy项目
命令:scrapy startproject + <项目名字>
实例: scrapy startproject myspider
生成的目录和文件结构分析
items.py 自己预计需要爬去的内容
middlewares.py 自定义中间件的文件
pipelines.py 管道,保存数据
setting.py 设置文件,UA,启动管道
spiders 自定义的spider的文件夹
scrapy.cfg 项目的配置文件
3、命令创建爬虫
命令: scrapy genspider +<爬虫名字> + <允许爬取的域名>
示例:scrapy genspider itcast itcast.cn
crawlspider类的使用
1、crawlspider-简介
CrawlSpider 是 Scrapy 框架中的一个通用爬虫类,专门设计用于处理需要跟踪链接的网页抓取任务。与基本的 Spider 类相比,CrawlSpider 提供了更高级的功能,特别是通过定义一组规则(Rule)来自动处理页面中的链接,并根据这些规则决定哪些链接应该被跟进,以及如何解析这些链接指向的页面。
2、crawlspider-特点
1 、规则定义:
CrawlSpider 使用 Rule 对象来定义抓取行为。每个 Rule 对象指定了如何提取链接、哪些链接需要跟进、以及如何处理跟进链接的响应。
规则通常包括一个 LinkExtractor(用于提取链接)和一个回调函数(用于处理响应)。
2 、自动跟进链接:
CrawlSpider 会自动根据规则提取页面中的链接,并决定是否跟进这些链接。这使得它非常适合抓取具有层次结构或分页的网站。
3 、灵活性:
虽然 CrawlSpider 是自动化的,但它仍然允许开发者通过自定义规则和回调函数来控制抓取过程。
3、用命令创建一个crawlspider的模块:
> scrapy genspider -t crawl <爬虫名字> <all_domain>
> scrapy genspider -t crawl itcast itcast.cn
4、关键组件
1 、LinkExtractor:
用于从页面中提取链接。可以通过参数(如 allow、deny、allow_domains 等)来控制提取哪些链接。
2 、Rule:
定义抓取规则,包括如何提取链接、是否跟进链接、以及如何处理响应。
3 、parse_item:
用于处理跟进链接的响应。可以在这里提取数据或执行其他操作。
4 、rules:
是一个元组或者是列表,包含的是Rule对象
5 、callback :
表示经过连接提取器提取出来的url地址响应的回调函数,可以没有,没有表示响应不会进行回调函数的处理
6 、follow:
表示进过连接提取器提取的url地址对应的响应是否还会继续被rules中的规则进行提取,True 表示会,Flase表示不会
5、示例
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class MyCrawlSpider (CrawlSpider ):
name = 'mycrawlspider'
allowed_domains = ['example.com' ]
start_urls = ['http://www.example.com' ]
rules = (
Rule(LinkExtractor(allow=()), callback='parse_item' , follow=True ),
)
def parse_item (self, response ):
yield {
'title' : response.css('title::text' ).get(),
'url' : response.url,
}
class Itcast1Spider (CrawlSpider ):
name = 'itcast1'
allowed_domains = ['itcast.cn' ]
start_urls = ['http://itcast.cn/' ]
rules = (
Rule(LinkExtractor(allow=r'Items/' ), callback='parse_item' , follow=True ),
)
def parse_item (self, response ):
i = {}
return i
scrapy-下载中间件
1、下载中间件-简介:
在 Scrapy 中,下载中间件(Downloader Middleware)是一个强大的机制,允许开发者在请求发送到下载器之前或响应返回给爬虫之前对其进行处理。下载中间件可以用于修改请求、处理响应、处理异常、实现自定义的重试逻辑等。
2、下载中间件-作用:
下载中间件位于 Scrapy 引擎和下载器之间,可以拦截并处理以下内容:
请求(Request):在请求发送到下载器之前,可以修改请求的 URL、头信息、Cookies 等。
响应(Response):在响应返回给爬虫之前,可以修改响应内容或生成新的响应。
异常(Exception):在下载过程中发生异常时,可以捕获并处理异常。
应用场景:
设置全局请求头:例如添加 User-Agent、Referer 等。
代理管理:动态切换代理 IP。
请求重试:自定义重试逻辑,例如根据状态码或异常类型重试。
响应处理:例如解压缩响应内容、修改响应体等。
异常处理:例如捕获超时异常并记录日志。
3、下载中间件-使用:
3-1、下载中间件的执行顺序
Scrapy 的下载中间件按照定义的顺序依次执行。每个中间件可以选择处理请求/响应,或者将其传递给下一个中间件。中间件的顺序在 settings.py 文件中通过 DOWNLOADER_MIDDLEWARES 设置。
3-2、Downloader Middlewares默认的方法:
process_request(self, request, spider):
process_response(self, request, response, spider):
3-3、示例:
class CustomHeaderMiddleware :
def process_request (self, request, spider ):
request.headers['X-Custom-Header' ] = 'MyCustomValue'
return None
def process_response (self, request, response, spider ):
return response
def process_exception (self, request, exception, spider ):
pass
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.CustomHeaderMiddleware' : 543 ,
}
3-4、示例-实现随机User-Agent的下载中间件:
class UserAgentMiddleware (object ):
def process_request (self,request,spider ):
agent = random.choice(agents)
request.headers['User-Agent' ] = agent
USER_AGENTS = [
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5. 30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)" ,
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)" ,
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)" ,
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/ 419.3) Arora/0.3 (Change: 287 c9dfb30)" ,
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0. 6" ,
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1" ,
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0" ,
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]
3-5、示例-实现随机使用代理的下载中间件:
class ProxyMiddleware (object ):
def process_request (self,request,spider ):
proxy = random.choice(proxies)
request.meta['proxy' ] = proxy
scrapy-模拟登录
1、对比request 和 selenium 模拟登录
1 、requests:
1 -1 、 直接携带cookies请求页面
1 -2 、接口发送post请求存储cookie
2 、selenium:
2 -1 、找到对应的input 标签,输入文字点击登录
3 、scrapy:
3 -1 、直接携带cookie
3 -2 、找到发送post请求的url地址,带上信息,发送请求
2、scrapy携带cookie进行模拟登陆
2-1、携带cookie进行模拟登陆应用场景
1 、cookie过期时间很长,常见于一些不规范的网站
2 、能在cookie过期之前把搜有的数据拿到
3 、配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地,scrapy发送请求之前先读取本地cookie
2-2、scrapy的start_requests方法
def start_requests (self ):
cls = self.__class__
if method_is_overridden(cls, Spider, 'make_requests_from_url' ):
warnings.warn(
"Spider.make_requests_from_url method is deprecated; it "
"won't be called in future Scrapy releases. Please "
"override Spider.start_requests method instead (see %s.%s)." % (
cls.__module__, cls.__name__
),
)
for url in self.start_urls:
yield self.make_requests_from_url(url)
else :
for url in self.start_urls:
yield Request(url, dont_filter=True )
2-3、示例:实现携带cookie登陆人人网
import scrapy
import re
class RenrenSpider (scrapy.Spider):
name = 'renren'
allowed_domains = ['renren.com' ]
start_urls = ['http://www.renren.com/941954027/profile' ]
def start_requests (self ):
cookie_str = "cookie_str"
cookie_dict = {i.split("=" )[0 ]:i.split("=" )[1 ] for i in cookie_str.split("; " )}
yield scrapy.Request(
self.start_urls[0 ],
callback=self.parse,
cookies=cookie_dict,
)
def parse (self, response ):
ret = re.findall("新用户287" ,response.text)
print (ret)
yield scrapy.Request(
"http://www.renren.com/941954027/profile?v=info_timeline" ,
callback=self.parse_detail
)
def parse_detail (self,response ):
ret = re.findall("新用户287" ,response.text)
print (ret)
3、示例:使用scrapy模拟登陆github
3-1、实现步骤
1 、获取登录页面的 CSRF 令牌:GitHub 的登录表单通常包含一个 CSRF 令牌,用于防止跨站请求伪造攻击。
2 、发送 POST 请求提交登录表单:包括用户名、密码和 CSRF 令牌。
3 、处理登录后的会话:确保后续请求携带登录后的 Cookies。
3-2、创建一个Script 项目
> scrapy startproject github_login
> cd github_login
3-3、编写 Spider
在 spiders 目录下创建一个新的 Spider 文件(如 github_spider.py):
import scrapy
from scrapy.http import FormRequest
class GithubLoginSpider (scrapy.Spider):
name = 'github_login'
start_urls = ['https://github.com/login' ]
def parse (self, response ):
csrf_token = response.css('input[name="authenticity_token"]::attr(value)' ).get()
return FormRequest.from_response(
response,
formdata={
'login' : 'your_username' ,
'password' : 'your_password' ,
'authenticity_token' : csrf_token,
},
callback=self.after_login
)
def after_login (self, response ):
if "Sign in to GitHub" in response.text:
self.logger.error("Login failed" )
else :
self.logger.info("Login succeeded" )
yield scrapy.Request(
url='https://github.com/settings/profile' ,
callback=self.parse_profile
)
def parse_profile (self, response ):
profile_name = response.css('.vcard-fullname::text' ).get().strip()
self.logger.info(f"Profile Name: {profile_name} " )
3-4、配置 settings.py
在 settings.py 中启用 Cookies 和 User-Agent 中间件,并设置一个合法的 User-Agent:
COOKIES_ENABLED = True
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
LOG_LEVEL = 'INFO'
3-5、运行 Spider
在项目根目录下运行以下命令启动爬虫:
scrapy crawl github_login
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异