前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >外行学 Python 爬虫 第八篇 功能优化

外行学 Python 爬虫 第八篇 功能优化

作者头像
keinYe
发布2019-08-01 11:13:12
5030
发布2019-08-01 11:13:12
举报
文章被收录于专栏:keinYekeinYe

在前一篇中讲了如何开启多线程来加快爬虫的爬取速度,本节主要对爬虫爬取内容机型优化,将生产商信息单独独立出来作为一张数据库表,不再仅仅是存储一个生产商的名称,同时保存了生产商的网址和介绍。

解析生产商信息

针对生产商页面的信息的解析方法请参考 外行学 Python 爬虫 第三篇 内容解析,在这里我们只需要按照相同的方法解析出生产商名称、网址、简介等信息即可,生产商数据表内容如下:

代码语言:javascript
复制
class Brands(Base, CRUDMixin):
    __tablename__ = 'brands'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100), nullable=False, unique=True)
    url = Column(String(100))
    desc = Column(Text)

    materials = relationship('Materials', backref='brands')

在完成数据表和网页信息解析相关的内容后,我们需要将生产商页面的 url 加入爬虫的有效 url 中,在整个程序中使用正则表达式来判断一个 url 是否是一个有效的 url,正则表达式的规则如下:

代码语言:javascript
复制
r'https?://(www|list|item).szlcsc.com(/(catalog|brand))?(/[0-9]*)?.html'

在 python 使用 re 模块来处理正则表达式

该表达式可以过滤出一下网址:

代码语言:javascript
复制
'https://www.szlcsc.com/catalog.html'
'https://list.szlcsc.com/catalog/542.html'
'https://item.szlcsc.com/22931.html'
'https://www.szlcsc.com/brand.html'
'https://list.szlcsc.com/brand/11442.html'

以上网址包含了元件目录、元件列表、元件详情、生产商列表、生产商详情等页面。

一下 url 校验的函数,函数接收正则表达式和 url 两个参数

代码语言:javascript
复制
def check_url(self, regex, url):
        if regex is None or url is None:
            return False
        if re.match(regex, url) is None:
            return False
        return True

由于元件信息和生产商信息相互关联,且一个生产商可以对应多个元件,因此需要先获取生产商的信息,在获取网页中的 url 时,需要先对生产商的 url 进行识别,然后在识别元件的 url,相关的函数如下:

代码语言:javascript
复制
def __find_url(self, current_url, html):
        for link in html.find_all(name='a', href=re.compile(REGEX_EXP_BRAND_LIST)):
            url = link.get('href')
            if not self.url_in_bloomfilter(url):
                if Crawler.url_queue.qsize() < Crawler.max_url_count:
                    self.url_add_bloomfilter(url)
                    Crawler.url_queue.put(url)

        if self.check_url(REGEX_EXP_CATLOG_LIST, current_url):
            if Crawler.url_queue.qsize() > Crawler.max_url_count:
                Crawler.url_queue.put(current_url)
            else:
                self.get_product_item_url(current_url)

        for link in html.find_all(name='a', href=re.compile(REGEX_EXP_ALL)):
            url = link.get('href')
            if not self.url_in_bloomfilter(url):
                if Crawler.url_queue.qsize() < Crawler.max_url_count:
                    self.url_add_bloomfilter(url)
                    Crawler.url_queue.put(url)

整个程序的执行流程

真个程序执行后,在数据库中可以看到生产商、元件信息、元件价格等三张数据表,后面可以对着三个表的数据进行分析。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 keinYe 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解析生产商信息
  • 整个程序的执行流程
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档