在使用Scrapy爬取 www.tianqi.com
(或任何其他网站)的天气数据时,设置请求头(headers)是为了模仿真实的浏览器访问,从而减少被网站识别为自动化工具的可能性。这可以有助于避免IP封禁或其他形式的反爬虫机制。下面是一个基本的例子,展示如何在Scrapy中设置请求头。
- 创建Scrapy项目(如果你还没有创建的话):
scrapy startproject weather_scraper
- 编辑settings.py文件:
在你的Scrapy项目的 settings.py
文件中,你可以设置默认的请求头。找到 DEFAULT_REQUEST_HEADERS
选项,并添加或修改它以包含你想要模拟的浏览器的User-Agent和其他必要的头部信息。例如:
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','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'
}
你可以根据需要调整这些值,比如更改 User-Agent
以匹配不同的浏览器或操作系统版本。
- 在Spider中设置请求头:
如果你需要为特定的请求设置请求头,可以在编写爬虫(spider)时直接在 start_requests
方法或者 scrapy.Request
中指定 headers
参数。例如:
import scrapyclass WeatherSpider(scrapy.Spider):name = 'weather_spider'allowed_domains = ['tianqi.com']start_urls = ['http://www.tianqi.com/']def start_requests(self):for url in self.start_urls:yield scrapy.Request(url=url, callback=self.parse, headers={'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'})def parse(self, response):# Your parsing logic herepass
- 使用中间件管理请求头:
如果你希望更灵活地管理请求头,比如随机选择一个User-Agent,你可以创建一个自定义的下载中间件(Downloader Middleware)。在 middlewares.py
文件中添加如下代码:
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
import randomUSER_AGENT_LIST = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36',# Add more user agents as needed
]class RandomUserAgentMiddleware(UserAgentMiddleware):def process_request(self, request, spider):ua = random.choice(USER_AGENT_LIST)if ua:request.headers.setdefault('User-Agent', ua)
然后确保在 settings.py
中启用这个中间件:
DOWNLOADER_MIDDLEWARES = {'weather_scraper.middlewares.RandomUserAgentMiddleware': 400,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
- 使用中间件管理请求头不起作用?:
通常是中间件顺序问题:
确保自定义的中间件在Scrapy默认的UserAgentMiddleware之前执行。如果自定义中间件的优先级设置不当,可能会导致默认的UserAgentMiddleware覆盖了你的设置。在settings.py中,数字越小的中间件会越早被执行。确保你自定义的中间件优先级(如400)低于默认的UserAgentMiddleware(通常是500)。