首页 > 其他分享 >Scrapy 爬取旅游景点相关数据(六):代理使用

Scrapy 爬取旅游景点相关数据(六):代理使用

时间:2024-07-30 15:59:47浏览次数:13  
标签:旅游景点 get self 代理 爬取 item Scrapy proxy crawler

本期内容:(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

相关文章

  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 基于Python Django的旅游景点数据分析与推荐系统
    基于PythonDjango的旅游景点数据分析与推荐系统。源码+数据库+文档(LW)。开发技术:Pythondjangomysql。项目内容:系统包括多个功能模块,涵盖了用户管理、旅游景点管理、管理员管理、系统管理等方面,以及一些其他辅助功能和信息展示模块。用户管理模块允许管理员管理系统中的用......
  • 深入探索Pyppeteer:从振坤行到阳光高考的网页爬取与数据处理实战
    Pyppeteer反屏蔽selenium的消除指纹来源于pyppeteer的消除指纹.所以有的网站仍会检测到消除指纹的selenium并屏蔽你,而此时用pyppeteer即可解决反屏蔽安装pipinstallpyppeteer详细用法官方文档:https://miyakogi.github.io/pyppeteer/reference.htmllanuch使用Pyppetee......
  • IT实战课堂计算机毕业设计精品基于java的旅游景点管理网站SSM
    项目功能简介:《基于java的旅游网站ssm》该项目含有源码、文档等资料、配套开发软件、软件安装教程、项目发布教程等使用技术:开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Mav......
  • 国资央企招聘平台的招聘信息爬取
    前言国资央企招聘平台集成了众多国企央企的招聘。写一个脚本实现一下各个岗位的招聘接口当抓包的时候发现,这些岗位信息都是通过接口发布的。因此可以通过获取这个接口的数据爬取。编写代码:'''基于国资央企招聘平台的招聘信息。https://cujiuye.iguopin.com/'''import......
  • 使用 Scrapy 进行身份验证并登录用户会话的证书?
    在Scrapy文档中,有以下示例说明如何在Scrapy中使用带有登录数据的经过身份验证的会话:classLoginSpider(BaseSpider):name='example.com'start_urls=['http://www.example.com/users/login.php']defparse(self,response):return[FormRequest.from_response(......
  • 爬虫爬取免费代理ip(附源码)
    在爬取某些网站的时候我们有可能遇到ip反爬措施,通常可以使用代理ip的方法应对,本次我们要爬取的是国内某知名的代理ip网站,并挑选出其中响应速度符合我们要求的IP。爬取代码如下:defget_ip(last):proxies_list=[]#ip池forpageinrange(1......
  • python中scrapy爬取数据get()与getall()区别
    在使用scrapy进行爬取数据的时候,有些时候需要爬取的是一段文本,或者一个div里面有很多内容,这时候我们就要使用到get()或者getall()来获取数据: get():是获取的满足条件的第一个数据。getall():是获取的满足条件的所有数据。scrapyget()getall()原理在Scrapy中,get(......
  • pyqt5-网易云热歌列表爬取
    利用pyqt5实现网易云热歌列表爬取简单思路说明:利用QScrollArea滚动显示,QFlowLayout做布局,放置自定义的WidgetQNetworkAccessManager异步下载网页和图片QScrollArea滚动到底部触发下一页加载自定义控件说明:主要是多个layout和控件的结合,其中图片QLabel为自定义,通过setPixmap......
  • 利用request + BeautifulSoup 模块批量爬取内容,实现批量获取书名对应的豆瓣评分
    文章目录代码代码解释控制台输出结果代码#-*-coding:utf-8-*-frombs4importBeautifulSoupimportrequests,time,jsonheaders={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.394......