使用scrapy框架采集企业黄页数据

今天闲着无聊,好就没用scrapy框架写爬虫了,于是就写了一个企业黄页的爬虫脚本,采集顺企网黄页数据,保存到mongodb,话不多说,简单看下代码吧。

下面部分是spider代码(习惯使用beautifulsoup了QAQ)

import scrapy
from bs4 import BeautifulSoup
from shunqi.items import ShunqiItem
import re


class EpregSpider(scrapy.Spider):
    name = 'epreg'
    allowed_domains = ['11467.com']
    start_url = "http://b2b.11467.com/"

    def start_requests(self):
        yield scrapy.Request(url=self.start_url,callback=self.get_city)

    def get_city(self,response):
        soup = BeautifulSoup(response.text,"lxml")
        dl_listtxt = soup.find(text="按城市浏览全国公司黄页").findNext("div").find_all("dl",attrs={"class":"listtxt"})
        for dl in dl_listtxt:
            province = dl.find("dt").text.strip()
            dd_list = dl.find_all("dd")
            for dd in dd_list:
                city = dd.text.strip()
                city_link = "https:" + dd.find("a")["href"]
                yield scrapy.Request(url=city_link,callback=self.get_class,meta={"city":city,"province":province})


    def get_class(self,response):
        city = response.meta["city"]
        province = response.meta["province"]
        soup = BeautifulSoup(response.text,"lxml")
        class_all = soup.find(text=re.compile("公司分类")).findNext("ul").find_all("li")
        for li in class_all:
            dd_all = li.find("dl").find_all("dd")
            for dd in dd_all:
                cor_link = "https:" + dd.find("a")["href"]
                yield scrapy.Request(url=cor_link,callback=self.get_cor,meta={"city":city,"province":province})


    def get_cor(self,response):
        city = response.meta["city"]
        province = response.meta["province"]
        soup = BeautifulSoup(response.text,"lxml")
        company_list = soup.find("ul",attrs={"class":"companylist"})
        if company_list:
            company_list1 = company_list.find_all("div",attrs={"class","f_l"})
            for li in company_list1:
                whole_url = "https:" + li.find("h4").findNext("a")["href"]
                if "qiye" in whole_url:
                    whole_url = whole_url + "#contact"
                else:
                    whole_url = "https:" + li.find("h4").findNext("a")["href"]
                yield scrapy.Request(url=whole_url,callback=self.get_info,meta={"url":whole_url,"city":city,"province":province})
        is_pages = soup.find("div",attrs={"class","pages"})
        if is_pages:
            max_page = is_pages.find(text="尾页").findParent("a")["href"].split("-")[1].replace(".htm")
            page_href = is_pages.find(text="尾页").findParent("a")["href"]
            for page in range(2,int(max_page)+1):
                page_url = page_href.split("-")[0] + "-" + str(page) + ".htm"
                yield scrapy.Request(url=page_url,callback=self.get_cor,meta={"city":city,"province":province})

    def deal_item(self,soup,text,label):
        try:
            data = soup.find(text=re.compile("%s" % text)).findNext("%s" % label).text.strip().replace("\r\n","")
        except:
            data = None
        return data


    def get_info(self,response):
        item = ShunqiItem()
        whole_url = response.meta["url"]
        if "qiye" in whole_url:
            id = re.search("qiye\/(\d+)\.htm",whole_url,re.S).group(1)
        else:
            id = re.search("co\/(\d+)\.htm",whole_url,re.S).group(1)
        city= response.meta["city"]
        province = response.meta["province"]
        soup = BeautifulSoup(response.text,"lxml")
        adress = self.deal_item(soup,"公司地址:","dd")
        phone = self.deal_item(soup,"固定电话:","dd")
        manager = self.deal_item(soup,"经理:","dd")
        if self.deal_item(soup,"手机号码:","dd") == None:
            link_phone = self.deal_item(soup,"经理手机:","dd")
        else:
            link_phone= self.deal_item(soup,"手机号码:","dd")
        email = self.deal_item(soup,"电子邮件:","dd")
        cor_name = self.deal_item(soup,"法人名称:","td")
        business = self.deal_item(soup,"经营范围:","td")
        main_product = self.deal_item(soup,"主要经营产品:","td")
        for field in item.fields:
            item[field] = eval(field)
        yield item

下面是采集到一些数据的截图
在这里插入图片描述
以上就是基本的一些代码,本文章只是提供一些采集思路,有兴趣的可以自己写一下,不是很复杂。同时欢迎访问个人博客主页… …

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个Python框架,主要用于爬取互联网站点,并从中提取结构化的数据。它主要有以下组成部分: 1. 引擎(Engine):负责控制整个系统的数据流处理、触发事务。 2. 调度器(Scheduler):负责接受引擎发过来的请求并将其入队,以便引擎按照一定的策略进行请求的发送。 3. 下载器(Downloader):负责下载Scrapy引擎发送的所有请求,并将其获取到的响应交还给Scrapy引擎。 4. 爬虫(Spider):负责解析Downloader返回的响应,从中提取出所需的数据并生成数据项(Item),同时产生需要跟进的URL请求,也就是回调函数。 5. 数据管道(Pipeline):负责处理Spider从页面中抽取到的数据,并进行数据清洗、验证、存储等一系列操作。 6. 下载中间件(Downloader Middleware):可以自定义一些中间件,用于扩展下载器功能,比如设置代理、设置UA等等。 7. 爬虫中间件(Spider Middleware):可以自定义一些中间件,用于扩展Spider功能,比如对请求或响应进行处理等等。 以下是一个简单的Scrapy爬虫示例代码: ``` import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://www.example.com'] def parse(self, response): for quote in response.css('div.quote'): yield { 'text': quote.css('span.text::text').get(), 'author': quote.css('span small::text').get(), } next_page = response.css('li.next a::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 以上示例代码使用Scrapy爬取了http://www.example.com网站上的名言警句,并将结果输出为JSON格式。你可以按照自己的需求修改代码并运行。如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值