然而,实用性很差,仅仅是能用而已。

已知bug:

由于土啬的问题,经常会炸掉。网络不稳定导致各种Connection Aborted/SSLError: EOF occurred in violation of protocol.

引入新的bug,无法记录错误啊啊啊!

解决方案:

已修复,添加异常处理,一次超时重试三次,超时值设定为1s。三次超时访问下一个页面,同时记录错误信息。

已修复,改了下代码。

程序运行速度已经有了很大的提高[约3pv/(s/thread)]

bug已经修复。

乱写的+现学现卖。

鸣谢:百度爬虫,感谢它的无私奉献(Anti-Anti-Spider Technology)

效果(速度不太稳定,约在1s/pv~10s/pv间波动):

(已经有了较大变化)

多进程生成器:

import sys
reload(sys)
sys.setdefaultencoding('utf8')
import codecs
for i in range(1,7000):
f = open(str(i*10)+'k'+'.py','w')
f.write('''# coding:utf-8
import re
import requests
import time
headers = {
'User-Agent':'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
}
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 20) sess.mount('https://', adapter)
for i in range ('''+str(10000*i)+''','''+str((i+1)*10000)+'''):
print(str(i))
url = "https://www.pixiv.net/member_illust.php?mode=medium&illust_id="+str(i);
try:
r = sess.get(url,headers = headers,timeout = 1)
except:
try:
r = sess.get(url,headers = headers,timeout = 1)
except:
try:
r = sess.get(url,headers = headers,timeout = 1)
except:
err = open('err'+str(i)+'.log',"a")
err.write(str(i)+"\\n")
err.close
continue
if r.status_code != 200:
continue
data = r.text
pattern = u'class="text">初音ミク</a>'
piclist = re.findall(pattern,data)
if len(piclist):
f = open("'''+str(i*10)+'k-'+str((i+1)*10)+'k'+'''.txt","a")
f.write(str(i)+'\\n')
f.close()''')
f.close()

生成实例:

# coding:utf-8
import re
import requests
import time
headers = {
'User-Agent':'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
}
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 20) sess.mount('https://', adapter)
for i in range (69990000,70000000):
print(str(i))
url = "https://www.pixiv.net/member_illust.php?mode=medium&illust_id="+str(i);
try:
r = sess.get(url,headers = headers,timeout = 1)
except:
try:
r = sess.get(url,headers = headers,timeout = 1)
except:
try:
r = sess.get(url,headers = headers,timeout = 1)
except:
err = open('err'+str(i)+'.log',"a")
err.write(str(i)+"\n")
err.close
continue
if r.status_code != 200:
continue
data = r.text
pattern = u'class="text">初音ミク</a>'
piclist = re.findall(pattern,data)
if len(piclist):
f = open("69990k-70000k.txt","a")
f.write(str(i)+'\n')
f.close()

UPDATE: 回家后更新多进程版,速度约25w pv/h.结合bash脚本实现不间断爬虫。然而还是很慢(摊手)。代码大范围重构,补了一点信息(回家后就能跑完了hhh)。稳定性有了提高(1000Wpv无错误)???

系统要求:

Linux主流发行版

内存8G(主进程虚拟内存2G,物理内存2G,worker进程不清楚,反正能跑,总内存消耗大约是4.4G左右)

四核CPU(占用率大约是170%-200%+)

40Mbps网络(外网,速度不是很稳定,约10-30Mbps左右)

------------------------------------------------------

150进程(然而实践证明100进程足矣)???

引入新的bug:单文件7000W数量级,gc会炸掉。orz.

PY简易爬虫的更多相关文章

  1. python简易爬虫来实现自动图片下载

    菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷. 估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择.本人借鉴网上的部分实现 ...

  2. 使用 HttpClient 和 HtmlParser 实现简易爬虫

    这篇文章介绍了 HtmlParser 开源包和 HttpClient 开源包的使用,在此基础上实现了一个简易的网络爬虫 (Crawler),来说明如何使用 HtmlParser 根据需要处理 Inte ...

  3. php+phpquery简易爬虫抓取京东商品分类

    这是一个简单的php加phpquery实现抓取京东商品分类页内容的简易爬虫.phpquery可以非常简单地帮助你抽取想要的html内容,phpquery和jquery非常类似,可以说是几乎一样:如果你 ...

  4. [转]使用 HttpClient 和 HtmlParser 实现简易爬虫

    http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...

  5. 爬虫系列1:python简易爬虫分析

    决定写一个小的爬虫系列,本文是第一篇,讲爬虫的基本原理和简易示例. 1.单个网页的简易爬虫 以下爬虫的主要功能是爬取百度贴吧中某一页面的所有图片.代码由主要有两个函数:其中getHtml()通过页面u ...

  6. nodeJS实现简易爬虫

    nodeJS实现简易爬虫 需求:使用nodeJS爬取昵图网某个分类下的图片并存入本地 运用nodeJS自带系统模块http.fs 示例代码: var http =require('http'); va ...

  7. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  8. day17 python re模块 简易爬虫

    day17 python   一.re模块     1.re模块的基础方法         查找findall() import re #re.findall(pattern,string,flags ...

  9. NodeJS概述2-事件插件-简易爬虫

    事件 events 模块 原生事件写法 /* * 1. 事件分类 * DOM0级 事件 - on + eventType * DOM2级 事件 - 事件监听 * 2. 事件构成部分有哪些? dom.o ...

随机推荐

  1. HDU 4891 The Great Pan (字符串处理)

    题目链接:HDU 4891 The Great Pan 求一串字符有多少种不同的意思,当中关心'{','}'之间的'|'. 和'$','$'之间的空格,连续N个空格算N+1种. AC代码: #incl ...

  2. HDU 5293

    树上DP题. 其实有点类似于01的问题.方程很容易想到.首先,因为一条链的节点其实都是在树上的,所以很容易想到应该先求一个LCA.然后,当某节点不是链的LCA时,它的转移就是: dp[i]=sum[i ...

  3. input子系统驱动学习之中的一个

        刚開始学习linux这门课就被分配编写一个设备的input子系统驱动.这对我的确有点困难.只是实际的操作中发现困难远比我想象的要大的多.本以为依照老师课上的步骤就行非常快的完毕这项任务.后来发 ...

  4. hdu1068 Girls and Boys --- 最大独立集

    有一个集合男和一个集合女,给出两集合间一些一一相应关系.问该两集合中的最大独立集的点数. 最大独立集=顶点总数-最大匹配数 此题中.若(a,b)有关.则(b,a)有关.每个关系算了两次,相当于二分图的 ...

  5. Linux -- 内存控制之oom killer机制及代码分析

    近期,线上一些内存占用比較敏感的应用.在訪问峰值的时候,偶尔会被kill掉,导致服务重新启动.发现是Linux的out-of-memory kiiler的机制触发的. http://linux-mm. ...

  6. 【Git笔记】怎样在同主机同账户下实现多个gitlab帐号管理各自的remote repo

    我们可能会遇到以下的场景: 1)多人共用同一台Linux开发机,该开发机仅仅有一个共用的work帐号,非常多人都用这个帐号登录主机进行日常开发. 2)该work帐号下统一安装了gitclient供多人 ...

  7. n阶导函数存在与n阶可导的区别

    1.f(x)n阶导函数存在 <=======>  f(n)(x)存在  指的是在某个区间内有定义 2.f(x)n阶可导根据题意可以有两种不同的解释: ①.题目中说的是在某点即在x=x0处n ...

  8. JNDI 笔记(一) 概述

    很多地方都会用到JNDI,一大堆的缩写加上一大堆不清不楚的概念描述,使得在看到的时候都不认识,更不要说使用了.   JNDI,Java Naming Directory Interface,J2EE的 ...

  9. HDU 5692 Snacks(DFS序+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  10. constraint和index--转载

    primary key和unique约束是要依赖index的,下面通过试验来看看他们之间的依赖关系!       SQL> select * from tt;   ID NA --------- ...