自己写一个爬虫 copider

copider 模仿scrapy的一些写法,当然我这个是单进程的,不是异步的

1.目录 copider/copider.py

#coding=utf-8

‘‘‘
Created on 2015年10月8日

@author: snt1
‘‘‘

import urllib2
import lxml.html
import StringIO

class Spider(object):
    def __init__(self, url, meta=None):
        self.URL = url
        self.META = meta
        self.TEXTMARK = self.get(url)
        self.SEL = self.selector(doc=self.TEXTMARK)

    def get(self, url):
        try:
            req = urllib2.Request(url)
            req.add_header(‘User-Agent‘, ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36‘)
            shtml = urllib2.urlopen(req, timeout=15).read()
        except Exception, e:
            print e,"...next.."

        data = StringIO.StringIO(shtml)
        HTML = data.read()
        return(HTML)

    # 返回html
    @property
    def html(self):
        return self.TEXTMARK

    @property
    def url(self):
        return self.URL

    @property
    def meta(self):
        return self.META

    def selector(self, doc=None):
        if doc:
            HTML = doc
        else:
            HTML = self.HTML
        return lxml.html.fromstring(HTML)

    def xpath(self, rule):
        iter_list = self.SEL.xpath(rule)
        attrList = []
        try:
            for ele in iter_list:
                attrList.append(ele.attrib)
                #attrList.append(ele.attrib)
            return attrList
        except Exception, e:
            return iter_list

def Request(url, func, **meta):
    if meta:
        response=Spider(url,meta[‘meta‘])
    else:
        response=Spider(url)
    func(response)

2.copider/aero.py

#coding=utf-8

‘‘‘
Created on 2015年10月8日

@author: snt1
‘‘‘

import re
import time
from copider import Spider, Request

class AeroCopider(object):

    name = "aero"
    storeId = "554b14c97b010cc731e81b35" # 站点ID
    allowed_domains = ["www.xxxx.com"]

    root_url = ‘http://www.xxxx.com‘
    category_url = root_url + ‘/category/index.jsp?numResultsPerPage=100&categoryId=%s‘
    cap_category_url = root_url + ‘/family/index.jsp?categoryId=%s&page=%d&numResultsPerPage=100‘
    url_dicts = {‘3534623‘:‘Girls‘, ‘3534624‘:‘Guys‘}

    def __init__(self):
        self.start_urls()

    def start_urls(self):
        for fid in self.url_dicts.keys():
            url = self.category_url %fid
            response = Spider(url)
            node_a = response.xpath(‘//*[@id="sidebar-left"]/div/dl[2]/dd//dt/a/@href‘)
            node_text = response.xpath(‘//*[@id="sidebar-left"]/div/dl[2]/dd//dt/a/text()‘)

            url_list, cid_list  = [],[]
            for num, preparing in enumerate(node_a):
                parttern = re.compile(r‘family.jsp\?categoryId=‘)
                if parttern.search(preparing):
                    chd_url = self.root_url+preparing
                    pattern_sub = re.compile(‘&cp=.*?$‘)
                    chd_url = pattern_sub.sub(‘‘, chd_url, re.S|re.I|re.M)

                    pattern_fin = re.compile(r‘family.jsp\?categoryId=(\d+)‘)
                    cid = pattern_fin.findall(chd_url)[0]
                    url_list.append(chd_url)
                    cid_list.append(cid)
                    print(u‘产品分类链接:%s -> %s‘ %(node_text[num], chd_url))
                    cateid = cid_list[num]
                    Request(chd_url, self.parse_page, meta={‘cateid‘:cateid})
                    print

    def parse_page(self, response):
        #total_page = response.xpath(‘//div[@class="pagination"]/ul/li/a[@rel="nofollow"]/text()‘)
        total_items = int(response.xpath(‘//*[@id="main-wrap"]//li[@class="count"]/span/text()‘)[0])
        mod, rem = divmod(total_items, 100)
        if mod > 1:
            if rem > 0:
                mod += 1
        else:
            mod = 1

        total_page = mod
        print(u‘产品总分页数: %s -> %s‘ %(total_page,response.url))

        cateid = response.meta[‘cateid‘]
        for page in range(1, total_page+1):
            url = self.cap_category_url %(cateid, page)
            Request(url, self.parse_product)

    def parse_product(self, response):
        product = response.xpath(‘//*[@id="products"]//h4/a/@href‘)
        print(u‘以下来自哪个页面:%s‘ %response.url)
        print(u‘产品:%s个 -> 路径:%s‘ %(len(product), product))

if __name__ == ‘__main__‘:
    AeroCopider()
时间: 2024-10-11 00:36:12

自己写一个爬虫 copider的相关文章

Storm【实践系列-如何写一个爬虫- 对于Protocol进行的封装】

本章描述:对于Protocol的封装 package com.digitalpebble.storm.crawler.fetcher; import com.digitalpebble.storm.crawler.util.Configuration; public interface Protocol {     public ProtocolResponse getProtocolOutput(String url) throws Exception;          public voi

Storm【实践系列-如何写一个爬虫- Metric 系列】1

package com.digitalpebble.storm.crawler; import backtype.storm.Config; import backtype.storm.metric.MetricsConsumerBolt; import backtype.storm.metric.api.IMetricsConsumer; import backtype.storm.task.IErrorReporter; import backtype.storm.task.OutputCo

Storm【实践系列-如何写一个爬虫】 - ParserBolt

阅读背景: 如果您对爬虫,或则web前端不够了解,请自行google. 代码前提:您需要参阅本ID 所写的前面两篇博文:  Storm[实践系列-如何写一个爬虫] - Fetcher 本章主题: ParserBolt 如何完成的解析,并且如何从前面的组件得到数据,并emit出去. 博文流程:  博文将整个 爬虫系列公开,其过程为: 1 : 代码实现. 2 : 对代码的细节进行解析. 3 : 对真个设计进行回顾,并作总结. 如果您在参看本ID的博文的过程之中,只存在流程 1.那么请继续等待.一旦公

通过写一个爬虫来学习大前端(草稿)

## 为什么说写爬虫能够磨练编程技艺呢?- 我们平时很不喜欢看别人的网站,通过写爬虫我们可以快速的对别人的网站布局有一个更好的理解- 可以提高我们的正则的水平- 提高http协议的水平- 我们可以充分的利用node的异步的优势- 可以玩一下一些好玩的node中间件- 考虑编码的问题- 我们会采用angular和bootstrap作为前端框架- 使用angular-router,做一个列表页和内容页- 熟悉一些开源工具像bower+npm+git- 当然这只是一个练习,我们把数据抓取下来之后,直接

用Scrapy写一个爬虫

昨天用python谢了一个简单爬虫,抓取页面图片: 但实际用到的爬虫需要处理很多复杂的环境,也需要更加的智能,重复发明轮子的事情不能干, 再说python向来以爬虫作为其擅长的一个领域,想必有许多成熟的第三方框架,百度后选用了 Scrapy作为平台构建复杂爬虫. Scarpy的下载安装不必细说,话说当前只支持python2.x版本,很郁闷,下载安装了python2.7. 安装完后,按照<Scrapy Tutorial>和Scrapy at a glance两篇帖子作为学习范本. 概念及步骤简要

用Python写一个最简单的网络爬虫

什么是网络爬虫?这是百度百科的解释: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫. 爬虫可以做什么?爬虫可以帮助我们在茫茫互联网中爬取我们需要的特定数据,这个特定数据可以是任何想获得的数据. 爬虫是一个让人热血的话题,因为当你在写爬虫的时候,你会感觉到自己是在做一件很NB的事,而每当写出一个爬虫,就会在此基础上不断尝试写出更NB的爬虫,有

用Python实现一个爬虫爬取ZINC网站进行生物信息学数据分析

最近接到实验室的导师交给我的一个任务,就是他们手头有很多smile表达式,格式类似这种:C(=C(c1ccccc1)c1ccccc1)c1ccccc1(这是生物信息学中表达小分子结构的一种常用表达式),他们需要对每个smile表达式在ZINC网站(生物信息学数据网站)上进行搜索,然后找到对应的ZINC号.小分子供应商.构象预测等信息.基本步骤如下: 点击查找之后网页就会跳转到详细信息,我们需要获取它的ZINC号.小分子供应商.构象预测.CAS号等信息,如下: 这一套流程要是靠人工手动完成的话有点

也写一个简单的网络爬虫

引子 在cnblogs也混了许久,不过碍于平日工作太忙,一篇随笔也没有写过.最近经常感觉到自己曾经积累过的经验逐步的丢失,于是开通了博客,主要是记录一下自己在业余时间里玩的一些东西. 缘起 言归正传.某次在在某高校网站闲逛,看到了一些有趣的东西想要保存起来,但是却分散在各个页面,难以下手.使用baidu,google却有无法避免的搜索到此站点之外的内容.于是就想如果有一个爬虫,可以抓取指定域名的某些感兴趣的内容,不是很好.在网上简单搜索了一下,简单的都不满意,功能强大的又太复杂,就想自己写一个.

爬虫入门 手写一个Java爬虫

本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做什么的?  他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径, 然后继续访问,继续解析;继续查找需要的数据和继续解析出新的URL路径  . 这就是网络爬虫主要干的工作.  下面是流程图: 通过上面的流程图