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 = {'':'Girls', '':'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()

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

  1. 用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话

    wechatBot 微信每日说,每日自动发送微信消息给你心爱的人 项目介绍 灵感来源 在掘金看到了一篇<用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件>后, 在评论区偶然 ...

  2. 用python写一个爬虫——爬取性感小姐姐

    忍着鼻血写代码 今天写一个简单的网上爬虫,爬取一个叫妹子图的网站里面所有妹子的图片. 然后试着先爬取了三页,大概有七百多张图片吧!各个诱人的很,有兴趣的同学可以一起来爬一下,大佬级程序员勿喷,简单爬虫 ...

  3. Python:Scrapy(二) 实例分析与总结、写一个爬虫的一般步骤

    学习自:Scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 - 知乎 Python Scrapy 爬虫框架实例(一) - Blue·Sky - 博客园 1.声明Item 爬虫爬取的目标是从非 ...

  4. 用Scrapy写一个爬虫

    昨天用python谢了一个简单爬虫,抓取页面图片: 但实际用到的爬虫需要处理很多复杂的环境,也需要更加的智能,重复发明轮子的事情不能干, 再说python向来以爬虫作为其擅长的一个领域,想必有许多成熟 ...

  5. 用 Python + itchat 写一个爬虫脚本每天定时给女朋友发微信暖心话

    https://github.com/sfyc23/EverydayWechat.git

  6. 爬虫入门 手写一个Java爬虫

    本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...

  7. 用node.js写一个简单爬虫,并将数据导出为 excel 文件

    引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...

  8. 用Python写一个小爬虫吧!

    学习了一段时间的web前端,感觉有点看不清前进的方向,于是就写了一个小爬虫,爬了51job上前端相关的岗位,看看招聘方对技术方面的需求,再有针对性的学习. 我在此之前接触过Python,也写过一些小脚 ...

  9. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

随机推荐

  1. MyBatis3-缓存使用

    一级缓存和二级缓存的区别: 1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为同一个SqlSession,当Session flush或close之后,该Sessi ...

  2. [Vue + TS] Watch for Changes in Vue Using the @Watch Decorator with TypeScript

    Vue watchers allow to perform async updates as a side effect of a property change. This lesson shows ...

  3. Oracle Study之--Oracle 11gR2通过RMAN克隆数据库

    Oracle Study之--Oracle 11gR2通过RMAN克隆数据库 Purpose of Database Duplication A duplicate database is usefu ...

  4. tiny4412 裸机程序 一、说明【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37109115 首先.我想说明为什么我写这个文档?我自己想学点东西,过于求成,又过于自信,直接买了 ...

  5. css list menu

    选择让page和folder都显示出来

  6. restrict关键字

    值得注意的是,一旦你决定使用restrict来修饰指针,你必须得保证它们之间不会互相重叠,编译器不会替你检查. 关键字restrict有两个读者.一个是编译器,它告诉编译器可以自由地做一些有关优化的假 ...

  7. loj 102 最小费用流

    补一发费用流的代码 %%%棒神 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  8. mysql的启动和停止

    1.检查数据库服务器是否开启:任务管理器-->后台进程-->查看mysqld是否存在.存在说明开启了,反之没开启 2.管理员运行cmd,输入重启指令:net start **(**数据库名 ...

  9. thinkphp的model的where条件的两种形式

    thinkphp的model的where查询时有两种形式. $model->field('id')->where('customer_num is null or customer_num ...

  10. 一个不错的jquery插件模版

    pageplugin.js (function ($) { $.PagePlugin = function (obj, opt) { var options = $.extend({}, $.Page ...