爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

目录

  • 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

    • 1. scrapy图片的爬取/基于管道类实现
    • 2. 中间件的使用
    • 3. selenium在scrapy中的应用
    • 4. CrawlSpider
    • 5. 分布式
    • 5. 增量式

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

1. scrapy图片的爬取/基于管道类实现

  • 爬取流程:

    1. 爬虫类中将解析到的图片地址存储到item,将item提交给指定的管道
    2. 在管道文件中导包:from scrapy.pipelines.images import ImagesPipeline
    3. 基于ImagesPipeline父类,自定义一个管道类
    4. 重写管道类中的如下三个方法:

      指定文件路径

      def file_path(self,request,response=None,info=None):
          # 可以接收get_media_requests传递过来的meta,获取图片名称
          request.meta
      
      # 在配置文件设置
      # IMAGES_STORE=‘./imgs’

      对图片地址发送请求

      def get_media_requests(self,item,info):
         yield scrapy.Request(url,meta)
      
      # 将item中存储的图片地址进行get请求发送
      # meta就会传递给file_path方法

      返回item,交由下一个管道类处理

      def item_completed(self,request,item,info):
          return item
  • 代码示例

    items.py

    import scrapy
    
    class ImgproItem(scrapy.Item):
        img_src = scrapy.Field()
        img_name = scrapy.Field()

    imgDemo.py

    # -*- coding: utf-8 -*-
    import scrapy
    from imgPro.items import ImgproItem
    
    class ImgdemoSpider(scrapy.Spider):
        name = 'imgDemo'
        start_urls = ['http://www.521609.com/daxuemeinv/']
    
        def parse(self, response):
            li_list = response.xpath('//*[@id="content"]/div[2]/div[2]/ul/li')
            for li in li_list:
                img_src = 'http://www.521609.com'+li.xpath('./a[1]/img/@src').extract_first()
                img_name = li.xpath('./a[2]/b/text() | ./a[2]/text()').extract_first()+'.jpg'
                print(img_name)
                item = ImgproItem()
                item['img_src'] = img_src
                item['img_name'] = img_name
                yield item

    pipelines.py

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.pipelines.images import ImagesPipeline
    
    class ImgproPipeline(ImagesPipeline):
        # 指定文件存储的目录(文件名)
        def file_path(self,request,response=None,info=None):
            # 接收meta
            item = request.meta['item']
            return item['img_name']
    
        # 对指定资源进行请求发送
        def get_media_requests(self,item,info):
            # meta可以传递给file_path
            yield scrapy.Request(item['img_src'],meta={'item':item})
    
        # 用于返回item,将item传递给下一个即将被执行的管道类
        def item_completed(self,request,item,info):
            return item

    settings.py

    ITEM_PIPELINES = {
       'imgPro.pipelines.ImgproPipeline': 300,
    }
    
    # 指定文件存储的目录
    IMAGES_STORE = './imgs'

2. 中间件的使用

  • scrapy中间件:/在爬虫中一般使用下载中间件

    下载中间件/DownloaderMiddleware:位于引擎和下载器之间;

    爬虫中间件/SpiderMiddleware:位于引擎和Spider之间

  • 作用:

    拦截所有的请求和响应

  • 拦截请求:

    process_request拦截正常的请求

    process_exception拦截异常的请求,必须有return request返回值,对异常请求重新发送

    篡改请求的头信息:

    process_request
    request.headers['User-Agent'] = 'chorme'

    设置代理:

    process_exception:
    request.meta['proxy'] = 'http://ip:port'  # 是字符串不是字典

    注意:process_exception,return request的作用,将修正后的请求重新发送

  • 拦截响应:

    篡改响应数据:

    1. 不满足需求的响应数据对应的一定是不满足需求的响应对象,动态加载的数据就是不满足需求的对象
    2. 直接更换响应对象
  • 代码示例:

    配置文件settings.py:将中间件配置打开

    DOWNLOADER_MIDDLEWARES = {
       'middlePro.middlewares.MiddleproDownloaderMiddleware': 543,
    }

    爬虫文件middle.py:

    # -*- coding: utf-8 -*-
    import scrapy
    
    class MiddleSpider(scrapy.Spider):
        name = 'middle'
        start_urls = ['http://www.521609.com/daxuemeinv/']
    
        def parse(self, response):
            li_list = response.xpath('//*[@id="content"]/div[2]/div[2]/ul/li')
            for li in li_list:
                img_src = 'http://www.123'+li.xpath('./a[1]/img/@src').extract_first()
                yield scrapy.Request(img_src)

    中间件middlewares.py

    # -*- coding: utf-8 -*-
    from scrapy import signals
    
    import random
    class MiddleproDownloaderMiddleware(object):
        # 拦截正常请求
        # 参数request:拦截到的请求
        user_agent_list = ['UA池']
        def process_request(self, request, spider):
            print('proces_request!!!')
            # UA伪装
            request.headers['User-Agent'] = random.choice(self.user_agent_list)
            return None
        # 拦截所有的响应
        def process_response(self, request, response, spider):
    
            return response
        # 拦截发生异常的请求,目的就是为了将异常的请求进行修正,然后将修正之后的正常的请求进行重新发送
        def process_exception(self, request, exception, spider):
            # 代理操作
            request.meta['proxy'] = 'http://ip:port'
            print('i am exception!!!')
            return request

3. selenium在scrapy中的应用

  • selenium在scrapy中的编码流程:

    1. 在爬虫类中实例化浏览器对象:将实例化出来的浏览器作为爬虫类的一个属性;属性可以交互给中间件类
    2. 编写自动化操作:写在中间件的process_response中
    3. 关闭浏览器: 写在爬虫类的closed(self)方法中,只会在关闭的时候执行一次
  • 需求:爬取网易新闻中国内,国际,军事,航工,无人机这五个板块下所有的新闻标题和内容

    分析:

    1. 通过中间件更换不满足需求的响应对象
    2. 在scrapy中应用selenum
    3. 每一个板块中显示的新闻标题是动态加载的

    代码实现:

    settings.py

    # 打开中间件配置
    DOWNLOADER_MIDDLEWARES = {
       'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
    }

    wangyi.py:爬虫文件

    # -*- coding: utf-8 -*-
    import scrapy
    from selenium import webdriver
    from wangyiPro.items import WangyiproItem
    
    class WangyiSpider(scrapy.Spider):
        name = 'wangyi'
        start_urls = ['https://news.163.com/']
    
        # 整个项目中涉及的响应对象个数:1+5+n
        # 解析:解析五个新闻板块对应的url
        five_model_urls = []
        bro = webdriver.Chrome(executable_path=r'chromedriver.exe')
    
        # 方法只会被调用一次
        def closed(self,spider):
            self.bro.quit()
    
        def parse(self, response):
            li_list = response.xpath('//*[@id="index2016_wrap"]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')
            model_indexs = [3,4,6,7,8]
            for index in model_indexs:
                li_tag = li_list[index]
                # 解析出了每一个板块对应的url
                model_url = li_tag.xpath('./a/@href').extract_first()
                self.five_model_urls.append(model_url)
                # 对每一个板块的url进行手动的请求发送
                yield scrapy.Request(model_url,callback=self.parse_model)
    
        # 解析:每一个板块中的新闻标题和新闻详情页的url(两个值都是动态加载出来的)
        def parse_model(self,response):
            # 遇到了不满足需求的响应对象就是当前方法中的response参数
            div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div/div/ul/li/div/div')
            for div in div_list:
                title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
                detail_url = div.xpath('./div/div[1]/h3/a/@href').extract_first()
                item = WangyiproItem()
                item['title'] = title
                if detail_url:
                    yield scrapy.Request(detail_url,callback=self.parse_detail,meta={'item':item})
    
        # 爬取新闻详情
        def parse_detail(self,response):
            item = response.meta['item']
            content = response.xpath('//*[@id="endText"]//text()').extract()
            content = ''.join(content)
            item['content'] = content
    
            yield item

    middlewares.py

    # -*- coding: utf-8 -*-
    from scrapy import signals
    from scrapy.http import HtmlResponse
    from time import sleep
    
    class WangyiproDownloaderMiddleware(object):
    
        def process_request(self, request, spider):
            return None
    
        # 拦截所有的响应(1+5+n),只有5个响应不满足需求,动态加载数据只能爬取少量数据
        def process_response(self, request, response, spider):
            # request.url:每一个响应对应的url
            # spider.five_model_urls:5个板块对应的url
            if request.url in spider.five_model_urls:
                # 满足if条件的response就是5个板块对应的response
                spider.bro.get(request.url)   # 对每一个板块对应的url进行get请求发送
                sleep(3)
                spider.bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
                sleep(2)
                page_text = spider.bro.page_source
                new_response = HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)
                return new_response
            else:
                return response
    
        def process_exception(self, request, exception, spider):
            pass
    
    # 流程总结:
    # 1.将拦截到所有的响应中的指定5个不满足需求的响应对象找出
    # 2.将这5个响应对象删除,实例化5个新的响应对象
    # 3.保证5个新的响应对象中包含动态加载出来的新闻标题数据
    # 4.将满足需求的5个新的响应对象返回

4. CrawlSpider

  • 作用:

    是Spider的一个子类,可以实现全站数据爬取

  • 实现流程:
    1. 创建工程:scrapy startproject proName
    2. 切换到工程目录:cd proName
    3. 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com
  • 关键点:

    LinkExtracor链接提取器:可以根据指定的规则(allow=正则)进行链接的提取

    Rule规则解析器:将链接提取器提取到的链接进行请求发送,然后根据指定的规则(callback)进行数据解析

    参数follow=True:将链接提取器 继续作用 到链接提取器提取到的链接 所对应的页面源码中

  • 代码示例:CrawlSpider实现深度爬取

    items.py :

    import scrapy
    
    class SunproItem(scrapy.Item):
        title = scrapy.Field()
        status = scrapy.Field()
    
    class SunproItem_content(scrapy.Item):
        content = scrapy.Field()

    sun.py/爬虫文件:

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from sunPro.items import SunproItem_content,SunproItem
    
    class SunSpider(CrawlSpider):
        name = 'sun'
        start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']
        # 实例化了一个链接提取器对象
        # 作用:可以根据指定的规则(allow=(正则))进行链接的提取,筛选链接
        link = LinkExtractor(allow=r'type=4&page=\d+')  # 提取页码链接
        link_detail = LinkExtractor(allow=r'question/\d+/\d+\.shtml')
        rules = (
            # 规则解析器
            # 作用:规则解析器可以将链接提取器提取到的链接进行请求发送且进行指定规则(callback)的数据解析
            Rule(link, callback='parse_item', follow=False),
            Rule(link_detail,callback='parse_detail')
        )
        # 该方法调用的次数请求的个数
        def parse_item(self, response):
            tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
            for tr in tr_list:
                title = tr.xpath('./td[2]/a[2]/@title').extract_first()
                status = tr.xpath('./td[3]/span/text()').extract_first()
                item = SunproItem()
                item['title'] = title
                item['status'] = status
                yield item
    
        def parse_detail(self,response):
            content = response.xpath('/html/body/div[9]/table[2]//tr[1]').extract()
            content = ''.join(content)
            item = SunproItem_content()
            item['content'] = content
    
            yield item
    
    # link:实例化了一个链接提取器对象
    # 作用:可以根据指定的规则(allow=(正则))进行链接的提取
    
    # Rule:规则解析器
    # 作用:规则解析器可以将链接提取器提取到的链接进行请求发送且进行指定规则(callback)的数据解析

    pipelines.py/管道:

    class SunproPipeline(object):
        def process_item(self, item, spider):
            if item.__class__.__name__ == 'SunproItem_content':
                print(item['content'])
            else:
                print(item['title'],item['status'])
            return item
    
    # 获取对象从属的父类的名称:.__class__.__name__

5. 分布式

  • 概念:

    可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取。

  • scrapy实现分布式:

    原生的scrapy是无法实现分布式:调度器无法被共享,管道无法被共享

    基于scrapy+redis(scrapy&scrapy-redis组件)实现分布式

  • scrapy-redis组件:

    作用:提供可被共享的管道和调度器

    环境安装:

    pip install scrapy-redis

    编码流程:

    1.创建工程:scrapy startproject proName

    2.切换到工程目录:cd proName

    3.创建crawlspider的爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com

    4.修改一下爬虫类:

    • 导包:from scrapy_redis.spiders import RedisCrawlSpider
    • 修改当前爬虫类的父类:RedisCrawlSpider
    • allowed_domains和start_urls删除
    • 添加一个新属性:redis_key = ‘xxxx‘可以被共享的调度器队列的名称

    5.修改配置settings.py

    &指定管道

    ITEM_PIPELINES = {
          'scrapy_redis.pipelines.RedisPipeline': 400
         }

    &指定调度器

    # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
    SCHEDULER_PERSIST = True

    &指定redis数据库

    REDIS_HOST = 'redis服务的ip地址'
    REDIS_PORT = 6379

    6.配置redis数据库(redis.windows.conf)

    # 关闭默认绑定
    56Line:#bind 127.0.0.1
    
    # 关闭保护模式
    75line:protected-mode no

    7.启动redis服务(携带配置文件)和客户端

    redis-server.exe redis.windows.conf
    redis-cli

    8.执行工程

    scrapy runspider spider.py
    
    # 先执行工程,让其产生调度器

    9.将起始的url扔入到可以被共享的调度器的队列(sun)中

    在redis-cli中操作:lpush sun www.xxx.com

    10.redis

    redis_key:items:存储的就是爬取到的数据
  • 代码示例:

    fbs.py:爬虫文件

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy_redis.spiders import RedisCrawlSpider
    from fbsPro.items import FbsproItem
    
    class FbsSpider(RedisCrawlSpider):
        name = 'fbs'
        # allowed_domains = ['www.xxx.com']
        # start_urls = ['http://www.xxx.com/']
        redis_key = 'sun'  # 可以被共享的调度器队列的名称
        link = LinkExtractor(allow=r'type=4&page=\d+')
        rules = (
            Rule(link, callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
            for tr in tr_list:
                title = tr.xpath('./td[2]/a[2]/@title').extract_first()
                status = tr.xpath('./td[3]/span/text()').extract_first()
    
                item = FbsproItem()
                item['title'] = title
                item['status'] = status
    
                yield item

    settings.py

    #指定管道
    ITEM_PIPELINES = {
        'scrapy_redis.pipelines.RedisPipeline': 400
    }
    #指定调度器
    # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
    SCHEDULER_PERSIST = True
    
    #指定redis
    REDIS_HOST = '192.168.16.64'
    REDIS_PORT = 6379

5. 增量式

  • 概念

    监测网站数据更新的情况。爬取到最新更新出来的数据。

  • 关键点:

    核心:去重,利用set

    记录表:记录爬取过的信息,需要持久化存储,redis中使用set进行持久化存储

  • 需求:url=https://www.4567tv.tv/frim/index1.html,爬取其电影的名称以及详情页的简介

    分析:

    1. 对于深度爬取:一般采用url作为唯一标识进行存储;

      比如:先在首页爬取链接,再根据这些链接爬取相应的内容,爬取图片

    2. 对于非深度爬取:一般通过数据指纹作为数据的唯一标识

      比如:没有动态加载的数据,所有数据都在本页

    3. 数据指纹:一组数据的唯一标识
  • 代码示例:

    movie.py:爬虫文件

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from redis import Redis
    from moviePro.items import MovieproItem
    
    class MovieSpider(CrawlSpider):
        name = 'movie'
        start_urls = ['https://www.4567tv.tv/frim/index1.html']
        conn = Redis(host='127.0.0.1',port=6379)
        link = LinkExtractor(allow=r'frim/index1-\d+\.html')  #提取页码链接
        rules = (
            Rule(link, callback='parse_item', follow=False),
        )
    
        def parse_item(self, response):
            # 电影名称+详情页的url
            li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
            for li in li_list:
                name = li.xpath('./div/a/@title').extract_first()
                item = MovieproItem()
                item['name'] = name
                detail_url = 'https://www.4567tv.tv'+li.xpath('./div/a/@href').extract_first()
                ex = self.conn.sadd('movie_record',detail_url)
                if ex == 1:  # 这部电影之前没有存在于记录表中
                    print('有最新更新的数据!!!!!!')
                    yield scrapy.Request(url=detail_url,callback=self.parse_detail,meta={'item':item})
                else:
                    print('暂无新数据的更新......')
    
        def parse_detail(self,response):
            item = response.meta['item']
            desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
            item['desc'] = desc
            yield item

    items.py

    import scrapy
    
    class MovieproItem(scrapy.Item):
        name = scrapy.Field()
        desc = scrapy.Field()

    pipelines.py

    class MovieproPipeline(object):
        def process_item(self, item, spider):
            conn = spider.conn
            conn.lpush('movieData',item)
            return item
  • 增量式总结:

    对于深度爬取,可以在爬取之前对比记录表中是否已经有该url;

    对于非深度爬取,只能是在爬下来之后,加过加密校验后,判断校验值是否相同,进而确定是否保存到数据库/记录表

原文地址:https://www.cnblogs.com/liubing8/p/12020237.html

时间: 2024-12-28 02:02:45

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式的相关文章

爬虫动态渲染页面爬取之selenium驱动chrome浏览器的使用

Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,可以用其进行网页动态渲染页面的爬取. 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等. 1. 示例 ### selenium的使用 ''' Selenium是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 支持的浏览器包括IE(7

爬虫之蜂鸟网图片爬取

今天分析一波蜂鸟网,话不多说,先来一波网址,url =“ http://image.fengniao.com/index.php#p=1”,首先一个美女图片瞧瞧, 分析一波网页,找到网站的分页特点,该网站请求方式为ajax请求,那么各位看官瞧仔细了,F12打开,鼠标轱辘往下翻,你会发现: 有什么发现么,页数变为2,还有一堆信息,点击右边第一个链接访问,一个新大陆在你眼前: 没错,该网页格式返回为json格式,还有一个高大上的名字====>该网站“API”,是不是有点小激动,相信如果学习过这方面知

Python网络爬虫(6)--爬取淘宝模特图片

经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存.网址为https://mm.taobao.com/json/request_top_list.htm.这个网址有很多页,通过在网址后添加?page=页码来进入指定的页. 为了爬取模特的图片,我们首先要找到各个模特自己的页面.通过查看网页源码,我们可以发现,模特各自的页面的特点如下: 我们可以通过查找class属性为lady-name的标签,然后取其href属性来获取各个模特各

Python Scrapy的QQ音乐爬虫 音乐下载、爬取歌曲信息、歌词、精彩评论

QQ音乐爬虫(with scrapy)/QQ Music Spider 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/12099547.html UPDATE 2019.12.23 已实现对QQ音乐文件的下载,出于版权考虑,不对此部分代码进行公开.此项目仅作为学习交流使用,支持正版,人人有责 项目介绍 在写一个项目的时候需要用到一些音乐的信息,但是在网上找了许久也没找到满意的音乐语料,于是便用scrapy写了一个QQ音乐的爬虫 由

python网络爬虫之使用scrapy自动爬取多个网页

前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面章节的网页,可以看到增加了上一页 对应的网页代码: 通过对比上面的网页代码可以看到. 上一页,目录,下一页的网页代码都在<div>下的<a>元素的href里面.不同的是第一章只有2个<a>元素,从二章开始就有3个<a>元素.因此我们可以通过<div>

Scrapy爬虫(5)爬取当当网图书畅销榜

??本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: ??我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲,可以参考上一篇博客,我们只需要修改items.py文件,以及新建一个爬虫文件BookSpider.py. ??items.py文件的代码如下,用来储存每本书的排名,书名,作者,出版社,价格以及评论数. import scrapy class BookspiderItem(scrapy.Item):

scrapy之360图片爬取

#今日目标 **scrapy之360图片爬取** 今天要爬取的是360美女图片,首先分析页面得知网页是动态加载,故需要先找到网页链接规律, 然后调用ImagesPipeline类实现图片爬取 *代码实现* so.py ``` # -*- coding: utf-8 -*- import scrapy import json from ..items import SoItem class SoSpider(scrapy.Spider): name = 'so' allowed_domains =

Python爬虫新手教程: 知乎文章图片爬取器

1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中去. 首先,需要获取任意知乎的问题,只需要你输入问题的ID,就可以获取相关的页面信息,比如最重要的合计有多少人回答问题.问题ID为如下标红数字 编写代码,下面的代码用来检测用户输入的是否是正确的ID,并且通过拼接URL去获取该问题下面合计有多少答案. import requests import r

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht