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

已知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. [Algorithms] The Bayes Rule

    Prior odd: The idea is to take the odds for something happening (against it not happening), which we ...

  2. 虚拟化(四):vsphere高可用功能前提-共享存储搭建

    虚拟化(一):虚拟化及vmware产品介绍 虚拟化(二):虚拟化及vmware workstation产品使用 虚拟化(三):vsphere套件的安装注意及使用 虚拟化(四):vsphere高可用功能 ...

  3. 关于strace的一点东西

    好久没写博客了,感觉有点羞愧,认为自己也应该静下心来利用自己可分配的时间去提升自己.        尽管近期在看一些Python的东西,但是认为自己还是不能忘记本行啊,Linux C的一些东西必须一直 ...

  4. 用MJExtension简化MVC

    首先引入MJExtension框架 模型 #import <Foundation/Foundation.h> @interface FundsModel : NSObject /** * ...

  5. Spring源代码解析和配置文件载入

    Spring类的继承结构图: Spring运用了大量的模板方法模式和策略模式,所以各位看源代码的时候,务必留意,每个继承的层次都有不同的作用.然后将同样的地方抽取出来,依赖抽象将不同的处理依照不同的策 ...

  6. Struts 配置文件

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  7. Socket之shutdown()用法

    通常来说,socket是双向的,即数据是双向通信的.但有些时候,你会想在socket上实现单向的socket,即数据往一个方向传输. 单向的socket便称为半开放Socket.要实现半开放式,需要用 ...

  8. C++_homework_EraseComment

    顾名思义就是删除程序中的注释,不清楚fsm的机制,完全是自己的思路做. 开头先读取一个字符确定是否到文件结尾,如果读取成功,是换行的话就换行,并继续读取,不是的话,用putback放回缓冲区,并整行读 ...

  9. Android单选中listview中的一项

    public class LipsListAdapter extends BaseAdapter { private Context context; private List<Lips> ...

  10. vim gvim技巧大全(9)(转载)

    vim gvim技巧大全(9) 2 用命令}移动到这个段落的底部,标记为b3 输入命令:'a,'b move来移动文本.老版本的Vi编辑器不能很好的来处理多文件.但是Vim在处理多文件上却显得优秀得多 ...