自己写一个爬虫 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 = {'':'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的更多相关文章
- 用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话
wechatBot 微信每日说,每日自动发送微信消息给你心爱的人 项目介绍 灵感来源 在掘金看到了一篇<用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件>后, 在评论区偶然 ...
- 用python写一个爬虫——爬取性感小姐姐
忍着鼻血写代码 今天写一个简单的网上爬虫,爬取一个叫妹子图的网站里面所有妹子的图片. 然后试着先爬取了三页,大概有七百多张图片吧!各个诱人的很,有兴趣的同学可以一起来爬一下,大佬级程序员勿喷,简单爬虫 ...
- Python:Scrapy(二) 实例分析与总结、写一个爬虫的一般步骤
学习自:Scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 - 知乎 Python Scrapy 爬虫框架实例(一) - Blue·Sky - 博客园 1.声明Item 爬虫爬取的目标是从非 ...
- 用Scrapy写一个爬虫
昨天用python谢了一个简单爬虫,抓取页面图片: 但实际用到的爬虫需要处理很多复杂的环境,也需要更加的智能,重复发明轮子的事情不能干, 再说python向来以爬虫作为其擅长的一个领域,想必有许多成熟 ...
- 用 Python + itchat 写一个爬虫脚本每天定时给女朋友发微信暖心话
https://github.com/sfyc23/EverydayWechat.git
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- 用node.js写一个简单爬虫,并将数据导出为 excel 文件
引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...
- 用Python写一个小爬虫吧!
学习了一段时间的web前端,感觉有点看不清前进的方向,于是就写了一个小爬虫,爬了51job上前端相关的岗位,看看招聘方对技术方面的需求,再有针对性的学习. 我在此之前接触过Python,也写过一些小脚 ...
- 用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...
随机推荐
- Diagnose High-Latency I/O Operations Using SystemTap
Luca Canali on 28 Jul 2015 Topic: this post is about some simple tools and techniques that can be us ...
- 淘宝手机rem的如何使用
1.主要介绍几个移动端常用的单位rem.vw.vh,配合传统的px.百分比.<viewport>标签,兼容适配移动端的各种分辨率的手机端. rm : 这个单位是以父元素为标准来进行计算 , ...
- DELPHI新版本WEBSERVICE的变化
DELPHI新版本WEBSERVICE,不仅可以编译成ISAPI DLL,依靠IIS部署, 并且还可以编译成单独的EXE,不再依赖IIS就可以独立运行,这一点未尝不可以说是非常方便的改进.
- Hadoop AWS Word Count 样例
在AWS里用Elastic Map Reduce 开一个Cluster 然后登陆master node并编译下面程序: import java.io.IOException; import java. ...
- [dfs] UVALive 3667 Ruler
题目链接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=1668">https://ic ...
- Android开发之使用sqlite3工具操作数据库的两种方式
使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...
- 【POJ 2777】 Count Color(线段树区间更新与查询)
[POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4094 ...
- cojs1101. [Vijos1369] 难解的问题==codevs 2188 最长上升子序列
[题目描述] 在你的帮助下,蔚蓝来到了埃及.在金字塔里,蔚蓝看到了一个问题,传说,能回答出这个问题的人就能受到埃及法老的祝福,可是蔚蓝日夜奋战,还是想不出来,你能帮帮他么?(XXX: 胡扯,教主怎么可 ...
- CI框架下CSS和JS的路径问题
注意:CI框架下的CSS和JS的引用必须放在框架外面,比如,可建立resource文件夹与application同级,用来封装CSS和JS. 在view层用resource里面CSS和JS可采用以下几 ...
- bzoj2648
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 kdtree裸题... 抄板子一边抄对了... 挺好理解的,就是说我们先找出中间的元素,然后小 ...