今天,又算是浪费了一天了。python爬虫,之前写过简单的版本,那个时候还不懂原理,现在算是收尾吧。

以前对网页爬虫不了解,感觉非常神奇,但是解开这面面纱,似乎里面的原理并不是很难掌握。首先,明白一个概念,HTTP协议,为什么叫超文本协议。超文本的概念,是所有的数据几乎都使用文本模式传输,包括文字,图像等,然后在一个网页中,需要做的是解析这些字符数据,并还原成原始的文件。

爬虫的概念,是以一个网页作为起点,从中发现更多的链接和数据信息,并依此以树形展开,可以想象成为一颗树,对每一个网页,需要按照需求对数据进行筛选(找图片,呢还是找关键字,或者找音频等),最后,根据筛选出的URL,对数据进行下载。大致步骤为:

网页==》网页树==》筛选信息==》下载

笔者这里就以网页图片作为例子:

比如,一张网页里,可能有很多张图片,首先最基本的是对这一张网页中所有的图片链接要能够识别出来,这里一般的方法是对网页文本根据正规式进行匹配,从而搜集包含图片的链接。eg:reg = r"""src\s*="?(\S+)\.jpg"""。其次,对于这些链接进行文件。看起来很抽象的东西,这两步就能实现。接着,网页树就有点难,需要从网页中找到有用的网页链接,然后对这些连接又一次进行筛选,有点像递归。这里的难点很多,比如,当网页链接数量非常多的时候,如何有效筛选有效连接,如何控制搜索深度,如何分配进程等等。

另外,由于目前很多国外的网站是上不去的,所以,有些网页数据下载需要通过代理;另外,考虑到有些机器性能较好,也实现了多线程的机制。笔者进行了一天的调研,终于调试通过。以下是代码:

import re
import os
import sys
import time
import threading
import socket
import urllib
import urllib2 server = '127.0.0.1'
port = '8087'
timeout = 720
socket.setdefaulttimeout(timeout) class timer(threading.Thread): #The timer class is derived from the class threading.Thread
def __init__(self, num, interval,dir,url):
threading.Thread.__init__(self)
self.thread_num = num
self.interval = interval
self.url = url
self.dir = dir
self.thread_stop = False
def run(self): #Overwrite run() method, put what you want the thread do here
#while not self.thread_stop:
DownloadImgs(self.interval,self.url,self.dir)
#print 'Thread Object(%d), Time:%s' %(self.thread_num, time.ctime())
#time.sleep(self.interval)
def stop(self):
self.thread_stop = True def getContent(url,type):
print(">>start connecting:%s" % url)
from urllib2 import Request, urlopen, URLError, HTTPError proxy = urllib2.ProxyHandler({'http':'http://127.0.0.1:8087'})
opener = urllib2.build_opener(proxy,urllib2.HTTPHandler)
urllib2.install_opener(opener)
try:
urlHandler = urllib2.urlopen(url)
headers = urlHandler.info().headers
length = 0
for header in headers:
if header.find('Length') != -1:
length = header.split(':')[-1].strip()
length = int(length)
if(type=="img" and length<15000):
print(" >>>>>>>>%d" % length)
dataStr = 'EOF'
else:
print(" ++++++++%d" % length)
dataStr = urlHandler.read()
except HTTPError, e:
print 'The server couldn\'t fulfill the request.'
print 'Error code: ', e.code
except URLError, e:
print 'We failed to reach a server.'
print 'Reason: ', e.reason
else:
# print("%s" % dataStr)
# f = open("text.txt",'wb')
# f.write(dataStr)
# f.close()
return dataStr
def DownloadImgs(interval,url,dir):
dataStr = getContent(url,"html")
print("...:%s" % url)
if(os.path.isdir(dir) == False):
os.mkdir(dir);
reg = r"""src\s*="?(\S+)\.jpg"""
imgre = re.compile(reg)
imglist = imgre.findall(dataStr)
x = 0
for imgurl in imglist:
imgurl =''.join('%s.jpg' % imgurl)
if(imgurl.find('http:')>=0):
print ("\tdownloading: %s,%s" % (x,imgurl))
imgdata=getContent(imgurl,"img")
if(imgdata != 'EOF'):
outputFile = '%s/%s.jpg' % (dir,x)
f = open(outputFile,'wb')
f.write(imgdata)
f.close()
x = x + 1
else:
print ("\tcannot connect: %s" % imgurl)
time.sleep(interval) url_="http://tieba.baidu.com/p/";
id=2460150866;
n=1; thread=[]
for i in range(0, n):
url=''.join('%s%d' % (url_,id + i))
dir=''.join('PIC%d' % (id+i) )
print("######dir = %s, id = %d" % (dir,id+i))
thread.append(timer(1, 1,dir,url))
for i in range(0, n):
thread[i].start() #for i in range(0, n):
# url=''.join('%s%d' % (url_,id + i))
# dir=''.join('PIC%d' % i)
# print("######dir = %s, id = %d" % (dir,id))
# DownloadImgs(0.1,url,dir)

python 网页爬虫+保存图片+多线程+网络代理的更多相关文章

  1. Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱(转)

    原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开 ...

  2. 【Python】Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱

    本文转载自:https://www.cnblogs.com/colipso/p/4284510.html 好文 mark http://www.52nlp.cn/python-%E7%BD%91%E9 ...

  3. Python网页爬虫(一)

    很多时候我们想要获得网站的数据,但是网站并没有提供相应的API调用,这时候应该怎么办呢?还有的时候我们需要模拟人的一些行为,例如点击网页上的按钮等,又有什么好的解决方法吗?这些正是python和网页爬 ...

  4. python网页爬虫开发之七-多线程爬虫示例01

    from urllib.request import quote import urllib.request from bs4 import BeautifulSoup import re impor ...

  5. python网页爬虫开发之二

    1.网站robots robotparser模块首先加载robots.txt文件,然后通过can_fetch()函数确定指定的用户代理是否允许访问网页. 2.识别网站技术 3.下载网页 使用urlli ...

  6. python网页爬虫

    1. 静态页面爬取 这类最简单啦,右键->查看页面源码时,想下载的信息都能够显示在这里,这时只需要直接down页面源码,代码如下: # Simple open web import urllib ...

  7. python网页爬虫小项目开发

    这是我最近接的一个小项目,花了是整整四天多时间. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...

  8. 使用Python SocketServer快速实现多线程网络服务器

    Python SocketServer使用介绍 1.简介: SocketServer是python的一个网络服务器框架,可以减少开发人员编写网络服务器程序的工作量. SocketServer总共有4个 ...

  9. python网页爬虫开发之三

    1.抓取目录页后用lxml进行页面解析,获取抓取列表 python3.6 urlparse模块变为urllib.parse 2.Python中有一个专门生成各类假数据的库:Faker 3.python ...

随机推荐

  1. 从HCE的各种问题 讨论未来趋势

    为了能让NFC手机支持NFC支付,维萨公司和万事达公司宣布了对HCE的研发,并且将很快推出最新的HCE规范.从2012年末,我一直在关注关于HCE的相关信息,其原因是由于我们公司参与了名为Simply ...

  2. 无法关闭的QT程序——思路开阔一下,原来这么简单!

    做一个无法关闭的QT程序(想关闭时要在任务管理器里关闭),看似很难, 其实它并不难,只要让程序在关闭时启动它自身就可以了. 上代码: #include <QtGui> class Temp ...

  3. Map map=new HashMap(); 为什么是这样

    Map是接口,hashMap是Map的一种实现.接口不能被实例化. Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现 ...

  4. OSCHina技术导向:Java模板引擎velocity

    OSChina 采用 velocity 作为页面模板 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template langua ...

  5. PDF转word文档

    本文未对扫描版的PDF实验,但是可编辑PDF版本可以转换为word而且转换后的word是可编辑的. 1.从http://xiazai.zol.com.cn/detail/33/326858.shtml ...

  6. ID3决策树算法原理及C++实现(其中代码转自别人的博客)

    分类是数据挖掘中十分重要的组成部分.分类作为一种无监督学习方式被广泛的使用. 之前关于"数据挖掘中十大经典算法"中,基于ID3核心思想的分类算法C4.5榜上有名.所以不难看出ID3 ...

  7. POJ 1724 最短路费用限制

    迪杰斯塔拉裸题 最大花费 n个点 m条有向边 起点终点 路径长度 路径花费 问:在花费限制下,最短路径的长度 #include <iostream> #include <string ...

  8. javascript第十七课:this使用

    例如,我们要一个元素的值 function f1(){ alert(this.id); } document.getElementByid('#id').onclick=f1;  //将函数赋值给事件

  9. apache端口被占用

      1.80端口被占用,先去服务里将IIS关闭掉,然后重启apache,如果还是继续弹窗the requested operation has failed...需要去Internet信息服务里面停止 ...

  10. 2014/4月金山WPS笔试

    今晚去參加了金山的笔试. 一開始还以为选C++的人不会非常多. 我去啊,一去到,好多人,一整个大教室都快满人了. 还好我算是去的比較早的了. 还拿到了一个位置. 金山还是挺不错的,对于我这类还没有实力 ...