爬取某网的公司企业信息

背景

以前我是做c++的,做了有2年多吧,其实也没学到什么东西(单位是国企),国企 大家可想而知,由于各种原因就跳槽了,来到了现在这家公司转为做python爬虫。来到这里也是一种缘分吧。废话不多说了。开始吧。
:第一次写东西,可能会很烂,初衷也就是想记录一下自己的学习和项目过程。

爬取某网公司企业库

项目需求

  • 通过某网-热门产品分类-企业和详情页抓取相关数据。

项目分析

  • 爬虫用到scrapy框架, 优点:对于爬取来说简单 轻巧且强大
  • 解析网页内容:xpath 同样 简单且强大(后面会提到)
  • 非结构化的数据存储采用mongo, 对于数据存取导出等操作极为方便,主要是在python中对使用mongo做了很多接口,实在是方便。。
  • 设计两个存储库:
    1.company_url:{url,status: 0 未抓取 1 已抓取 }(url唯一索引)
    2.bmlink_tbl:{需要抓取的字段} (url唯一索引)
  • 抓取公司url程序)通过一个入口(网址):(http://www.bmlink.com/newjoin/),遍历并保存公司的url。
  • 抓取公司信息程序)对url库中status为0的进行抓取,每抓取一个url对应的把url库中status 0 置为1 ,这样可以保证抓取程序抓完所有企业才停止。

开撸

一. 抓取公司url

  • 创建一个爬虫项目
    scrapy startproject company_url
  • 简单说下 scrapy框架吧,算了 附上网址自己简单了解下吧。http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/spiders.html
  • 在 items.py 中定义要抓取的字段
    class CompanyUrlItem(scrapy.Item):
        status = scrapy.Field() # 抓取状态标志 0 、1
        url = scrapy.Field() #要抓取的公司网址
    
  • 在 spider 目录下新建 spider.py 文件 开始编写爬取解析代码
         def start_requests(self):  # 入口函数
          try:
              for page in range(1, 1242): # 总共1241页
                  start_url = 'http://www.bmlink.com/newjoin/%d/' % (page)
                  meta = {'dont_redirect': True, 'dont_retry': True} # 字典传递字段
                  yield scrapy.Request(url=start_url, meta=meta, callback=self.parse, dont_filter=True) # 调用指定函数
          except:
              self.log('start_request error! (%s)' % (str(traceback.format_exc())), level=log.INFO)
    
  • 解析函数 提取公司网址
    def parse(self, response):
        sel = Selector(response)

        if response.status != 200: # 判断网页返回状态,正常是200
            self.log('fetch failed! status=%d' % (response.status), level=log.WARNING)

        i = CompanyUrlItem() # 调用 items.py 里面的类
        urls = sel.xpath("//ul[@class='list all']/li/a") # xpath 提取标签内容 返回列表
        for url in urls:
            i['url'] = url.xpath("@href")[0].extract()
            self.log('fetch succsed! url=%s' % (i['url']), level=log.INFO)

            yield i  # yield 把提取的字段传递到pipeline.py处理
  • 在工程目录下的 pipelines.py文件是处理提取到的内容 ,
      def process_item(self, item, spider): # 处理数据存储函数
        #insert mongo
        url = item['url']
        try:
            self.mongo_db.company_url.insert_one(
                {
                    'url': url,
                    'status': 0,
                    'insert_time': datetime.datetime.now()
                }
            )
        except pymongo.errors.DuplicateKeyError: #捕获唯一索引异常,如果mongo里存在则跳过
            spider.log('url is exist! url=%s' % (url), level=log.ERROR)
            pass
        except Exception, e:
            spider.log('insert mongo failed! url=%s (%s)' % (url, str(e)), level=log.ERROR)

        spider.log('piplines insert mongo succed. url:%s' % (url), level=log.INFO)
  • 至此,第一个抓取公司url程序完毕,就这么easy,其中的一些日志可以根据自己需要或喜好,自己添加。
  • scrapy crawl spider 开抓,刷刷刷。。。出去喝杯茶回来 去mongo库里查询,哇塞,好神奇,所有公司的网址都获取下来了耶!!

二. 抓取公司信息

  • 流程和上一个一样,准备工作做好,然后开撸就可以了,设计三个解析函数,
    def parse_introduce_page(self, response) # 解析公司介绍页面
    def parse_renzheng_page(self, response) # 解析认证页面
    def parse_contact_page(self, response) # 解析联系我们页面

这三个函数都是通过xpath 工具提取内容,用正则进行匹配需要的信息就ok了。代码太多行了就不一一上了,大部分都是xpath 和 正则相关的操作再加上判断就搞定了,也很easy。(我对正则不是很熟悉,搞这个正则搞了2天 很是头痛,有时间好好学习一下)

  • 这个项目到这里就结束了,项目过去好长时间了,现在才有空来整理一下,也属于我的第一个scrapy爬虫程序了吧。

你可能感兴趣的:(爬取某网的公司企业信息)