如何在Scrapy/Python3.6中使用for循环遍历EAN数组及代码放置位置
嘿,我来帮你搞定这个Scrapy爬虫的循环遍历问题!你需要的for循环应该放在Scrapy Spider的start_requests()方法里,这是爬虫生成初始爬取请求的标准入口,正好适合逐个遍历你的EAN数组并发起爬取。
完整代码示例(标注循环位置)
我先帮你补全代码并优化结构,重点标注出for循环的放置位置:
import scrapy import re import MySQLdb class ProductSpider(scrapy.Spider): name = 'product' # 初始化空的EAN列表 EAN = [] def __init__(self, *args, **kwargs): super(ProductSpider, self).__init__(*args, **kwargs) # 在这里初始化数据库连接(比类级别定义更安全,避免重复连接) self.db = MySQLdb.connect( host="localhost", user="root", passwd="", db="ProductSpider" ) self.cur = self.db.cursor() self.cur.execute("SELECT EAN FROM product") rows = self.cur.fetchall() # 把数据库返回的元组结果转换成EAN列表 self.EAN = [row[0] for row in rows] # 关闭数据库资源,避免泄漏 self.cur.close() self.db.close() def start_requests(self): # ------------------- 这里就是你要的for循环 ------------------- for ean in self.EAN: # 替换成你实际要爬取的商品页面URL,把EAN作为参数/路径传入 target_url = f"https://your-target-site.com/product/{ean}" # 发起爬取请求,指定解析回调函数,同时传递EAN到回调中 yield scrapy.Request( url=target_url, callback=self.parse_product, meta={'current_ean': ean} ) def parse_product(self, response): # 这里写你的页面解析逻辑,比如提取商品名称、价格等信息 current_ean = response.meta.get('current_ean') product_name = response.css('h1.product-title::text').get(default='').strip() product_price = response.css('span.price::text').get(default='').strip() # 输出或保存解析结果 yield { 'EAN': current_ean, 'product_name': product_name, 'product_price': product_price # 其他需要提取的字段... }
关键说明
- 数据库连接优化:把数据库连接逻辑移到
__init__方法里,比直接在类级别定义更合理,避免爬虫实例化时出现重复连接的问题。 - 循环的正确位置:
start_requests()是Scrapy爬虫生成初始请求的官方入口,在这里遍历EAN数组,逐个生成爬取请求,完全符合Scrapy的运行逻辑。 - 传递EAN到回调:通过
meta参数把当前遍历的EAN传递给解析函数parse_product,这样可以确保解析出的商品信息和对应的EAN一一对应。
内容的提问来源于stack exchange,提问作者Rousblack
相关产品推荐
相关产品推荐

