scrapy CrawlSpider设置headers

参考:
CrawlSpider带headers和cookies请求,解决302重定向和禁止访问问题

通常在使用CrawlSpider时,可以指定rules,但却没有指定headers、cookies的地方,我们可以在start_requests通过scrapy.Request指定headers和cookies,但是之后CrawlSpider在根据rules爬取的link请求新页面时,是没有携带headers的(默认会记住并携带cookie),我这边遇到的情况就是初始请求通过start_requests设置headers后可以正常访问,但是根据初始请求页面中提取的link则无法访问,返回403 forbidden,解决此问题亦可通过重写_build_request来为每个request请求设置headers
综上可结合如下两种方式:
(1)在start_requests方法中通过scrapy.Request指定初始请求的headers和cookies
(2)重写_build_request来为之后的每个request请求设置headers
示例代码如下:

    # 在start_requests通过scrapy.Request指定headers和cookies
    def start_requests(self):
        start_urls = self.rules_json.get("start_urls")
        for url in start_urls:
            # yield scrapy.Request(url=url, headers={"hello": "world"}, cookies={"user": "小明"})
            # 设置爬取URL及headers, cookies
            yield scrapy.Request(url=url, headers=self.default_request_headers, cookies=self.default_request_cookies)

	# 重写_build_request来为每个request请求设置headers
    def _build_request(self, rule_index, link):
        return scrapy.Request(
            url=link.url,
            # 重置headers
            headers=self.default_request_headers,
            callback=self._callback,
            errback=self._errback,
            meta=dict(rule=rule_index, link_text=link.text),
        )

<think>好的,我现在需要帮助用户使用Scrapy爬取携程网站的数据。首先,用户的问题是关于如何用Scrapy来爬取携程的数据,我需要根据提供的引用信息和自己的知识来构建一个清晰的步骤指南。 首先,我需要回忆Scrapy的基本结构和流程。Scrapy项目通常包括创建项目、定义Item、编写Spider、设置中间件和管道等步骤。用户提供的引用中有几个例子,比如引用[1]和引用[4]提到使用CrawlSpider设置中间件和管道,以及保存到MySQL数据库。这些可以作为参考。 接下来,我需要考虑用户的具体需求:爬取携程景点数据,包括名称、地址、省市县、描述、图片地址等信息。根据引用[1],起始URL是河南的景点页面,结构可能需要处理分页。所以,Spider需要能够跟随分页链接,并解析每个景点的详情页。 然后,我需要考虑如何设置Scrapy项目。用户可能需要创建项目,定义Item类,编写Spider,配置设置文件,处理请求头和中间件,以及数据存储。引用[4]中的settings.py配置很重要,特别是关闭ROBOTSTXT_OBEY,设置User-Agent中间件,以及数据库管道。 另外,引用[3]中的例子展示了如何定义Item字段,这可以帮助用户正确结构化数据。引用[2]中的CrawlSpider示例可能对处理链接跟随有帮助,但可能需要调整规则以适应携程的页面结构。 需要注意的点包括:携程网站可能有反爬措施,如User-Agent检查、IP封锁等,所以需要设置下载中间件来随机更换User-Agent,或者使用代理。此外,处理分页可能需要生成下一页的URL,或者通过LinkExtractor来提取分页链接。 数据存储部分,用户希望保存到MySQL,所以需要编写Pipeline来处理数据库连接和数据插入。引用[1]和[4]中的DBPipeline示例可以作为参考,使用pymysql或SQLAlchemy来操作数据库。 测试和调试也是重要的一环,用户可能需要运行Spider并检查输出,使用Scrapy shell来测试XPath表达式是否正确提取数据。 最后,可能需要提醒用户遵守网站的robots.txt,合法爬取数据,避免过快的请求频率导致被封禁。 总结步骤应该是:创建项目、定义Item、编写Spider(包括起始URL和解析方法)、配置中间件和管道、处理数据存储。同时,需要处理反爬措施,并确保代码结构清晰,符合Scrapy的最佳实践。</think>根据引用[1][4]的实践案例,以下是使用Scrapy爬取携程网站数据的详细步骤指南: ### 一、Scrapy项目搭建 1. 创建Scrapy项目 ```bash scrapy startproject ctrip cd ctrip scrapy genspider attractions piao.ctrip.com ``` 2. 定义数据模型(items.py) ```python import scrapy class CtripItem(scrapy.Item): name = scrapy.Field() # 景点名称 address = scrapy.Field() # 详细地址 location = scrapy.Field() # 省市县信息 description = scrapy.Field()# 景点描述 image_urls = scrapy.Field() # 图片地址 grade = scrapy.Field() # 景点评分 ``` ### 二、核心爬虫开发(attractions.py) ```python import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from ctrip.items import CtripItem class AttractionsSpider(CrawlSpider): name = "attractions" allowed_domains = ["piao.ctrip.com"] start_urls = [ 'http://piao.ctrip.com/dest/u-_ba_d3_c4_cf/s-tickets/P1/' ] rules = ( # 分页规则 Rule(LinkExtractor(restrict_xpaths='//a[@class="nextpage"]')), # 详情页规则 Rule(LinkExtractor(restrict_xpaths='//div[@class="list_wide_mod2"]//a'), callback='parse_item'), ) def parse_item(self, response): item = CtripItem() item['name'] = response.xpath('//h1[@class="detail_tt"]/text()').get() item['grade'] = response.xpath('//span[@class="score"]/text()').get() item['address'] = response.xpath('//p[@class="address"]/span/text()').get() item['image_urls'] = response.xpath('//div[@class="img_big"]/img/@src').getall() yield item ``` ### 三、关键配置(settings.py) ```python ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 2 # 控制爬取速度 DOWNLOADER_MIDDLEWARES = { 'ctrip.middlewares.RandomUserAgentMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None } ITEM_PIPELINES = { 'ctrip.pipelines.MysqlPipeline': 300, 'scrapy.pipelines.images.ImagesPipeline': 1 } IMAGES_STORE = './images' # 图片存储路径 ``` ### 四、反爬应对策略 1. 创建随机User-Agent中间件(middlewares.py) ```python import random from scrapy import Request user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...', # 至少准备20个不同UA ] class RandomUserAgentMiddleware: def process_request(self, request, spider): request.headers['User-Agent'] = random.choice(user_agents) ``` ### 五、数据存储(pipelines.py) ```python import pymysql class MysqlPipeline: def __init__(self): self.conn = pymysql.connect( host='localhost', user='root', password='123456', db='ctrip', charset='utf8mb4' ) self.cursor = self.conn.cursor() def process_item(self, item, spider): sql = """INSERT INTO attractions (name, address, grade, location, description) VALUES (%s,%s,%s,%s,%s)""" self.cursor.execute(sql, ( item['name'], item['address'], item['grade'], item['location'], item['description'] )) self.conn.commit() return item ``` ### 六、执行爬虫 ```bash scrapy crawl attractions -o data.json ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

罗小爬EX

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

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

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

打赏作者

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

抵扣说明:

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

余额充值