本期内容:(1)继续完善评论数据的爬取 (2) 代理的使用
1 创建数据库表
上期我们只打印了爬取到的数据,并没有入库,保存到数据,先执行以下SQL:
CREATE TABLE tb_comment (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
tid VARCHAR(255) COMMENT '景点ID',
username VARCHAR(255) COMMENT '评论的用户名',
avatar VARCHAR(255) COMMENT '评论用户的头像 URL',
comments TEXT COMMENT '评论的内容',
label VARCHAR(20) COMMENT '情感分析分类',
score decimal(10,2) comment '情感分析得分'
) COMMENT '评论数据表';
后续我们要做情感分析,所以预留了情感分析的字段。
2 编写管道
上一期已经把解析的代码写的差不多了,遗留了管道部分未写,下面补全:
# 保存mysql 景点评论
class TourCommentPipeline:
def __init__(self, crawler):
self.crawler = crawler
# 连接 MySQL 数据库
self.db = pymysql.connect(
host=self.crawler.settings.get('DB_HOST'),
user=self.crawler.settings.get('DB_USER'),
password=self.crawler.settings.get('DB_PASS'),
database=self.crawler.settings.get('DB_DATABASE'),
charset=self.crawler.settings.get('DB_CHARSET')
)
self.cursor = self.db.cursor()
@classmethod
def from_crawler(cls, crawler):
return cls(crawler)
def process_item(self, item, spider):
# 检查数据是否已存在
sql = "SELECT COUNT(*) FROM tb_comment WHERE tid = %s and username= %s "
self.cursor.execute(sql, (item["tid"], item['username']))
count = self.cursor.fetchone()[0]
if count > 0:
spider.log(f"Data already exists: {item['tid'], item['username']}")
return item
# 插入新数据
sql = ("INSERT INTO tb_comment (tid, username, avatar, comments) "
"VALUES (%s, %s, %s, %s)")
values = (
item["tid"],
item["username"],
item["avatar"],
item["comments"],
)
try:
self.cursor.execute(sql, values)
self.db.commit()
self.total_items += 1
spider.log(f"Saved data: {item['username']}")
except pymysql.Error as e:
self.db.rollback()
spider.log(f"Error saving data: {item['username']} - {e}")
return item
def close_spider(self, spider):
self.cursor.close()
self.db.close()
3 测试结果
测试爬取的结果是不太给力的,基本上爬取没多少时间,就会报ConnectionRefusedError
的异常,原因应该是目标网站已经监测到我们的爬取行为了。
中间尝试了调低scrapy的并发量和增加每次下载的延时,在settings.py里
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 2 #并发2,甚至我试过1,然并卵
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 2 # 这个调低了,爬取速度巨慢好吗?
修改这个参数会降低爬取效率,而且并不一定能绕开请求拒绝的问题(再说如果爬取非常慢还有啥意义呢
标签:旅游景点,get,self,代理,爬取,item,Scrapy,proxy,crawler From: https://blog.csdn.net/roccreed/article/details/140793769