python 多线程爬虫爬虫的小问题 多奖励!

> python写网络爬虫时遇到的问题现在很多网页并不是一次性全部加载完成的,而是在加载完页面后利用脚
python写网络爬虫时遇到的问题现在很多网页并不是一次性全部加载完成的,而是在加载完页面后利用脚
hitshenzhen & &
发布时间: & &
浏览:18 & &
回复:1 & &
悬赏:0.0希赛币
python写网络爬虫时遇到的问题现在很多网页并不是一次性全部加载完成的,而是在加载完页面后利用脚本和ajax或者iframe二次加载
我用python3.2的urllib.request.urlopen()打开的网页无法去解析读取某些二次加载进来的内容,此外还有些二次加载的内容的编码可能也和网页&meta&中声明的不同,导致解析的时候出现乱码
请问有什么解决办法
暂时没有很好的办法
2.x还可以借助pyv8去执行相关的js,但pyv8在3.x不可行
我暂时查到的资料是借助&PhantomJs&&=$>$;或者webkit,但我对这两个都不熟悉
我个人的解决方法是继续抓包,模拟二次发送(思路ing,未有实现例子)
乱码的问题,ajax/json一般都用utf-8(标准默认),所以看看js是否有对返回值转码
人家发什么编码是无法控制的,只能接收后转码HITTOWN & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&Python爬虫(六)--多线程续(Queue) - 为程序员服务
Python爬虫(六)--多线程续(Queue)
本文希望达到的目标:
学习Queue模块
将Queue模块与多线程编程相结合
通过Queue和threading模块, 重构爬虫, 实现多线程爬虫,
通过以上学习希望总结出一个通用的多线程爬虫小模版
1. Queue模块
Queue模块实现了多生产者多消费者队列, 尤其适合多线程编程.Queue类中实现了所有需要的锁原语(这句话非常重要), Queue模块实现了三种类型队列:
FIFO(先进先出)队列, 第一加入队列的任务, 被第一个取出
LIFO(后进先出)队列,最后加入队列的任务, 被第一个取出(操作类似与栈, 总是从栈顶取出, 这个队列还不清楚内部的实现)
PriorityQueue(优先级)队列, 保持队列数据有序, 最小值被先取出(在C++中我记得优先级队列是可以自己重写排序规则的, Python不知道可以吗)
1.1. 类和异常
import Queue
Queue.Queue(maxsize = 0)
#构造一个FIFO队列,maxsize设置队列大小的上界, 如果插入数据时, 达到上界会发生阻塞, 直到队列可以放入数据. 当maxsize小于或者等于0, 表示不限制队列的大小(默认)
Queue.LifoQueue(maxsize = 0)
#构造一LIFO队列,maxsize设置队列大小的上界, 如果插入数据时, 达到上界会发生阻塞, 直到队列可以放入数据. 当maxsize小于或者等于0, 表示不限制队列的大小(默认)
Queue.PriorityQueue(maxsize = 0)
#构造一个优先级队列,,maxsize设置队列大小的上界, 如果插入数据时, 达到上界会发生阻塞, 直到队列可以放入数据. 当maxsize小于或者等于0, 表示不限制队列的大小(默认). 优先级队列中, 最小值被最先取出
Queue.Empty
#当调用非阻塞的get()获取空队列的元素时, 引发异常
Queue.Full
#当调用非阻塞的put()向满队列中添加元素时, 引发异常
1.2. Queue对象
三种队列对象提供公共的方法
Queue.empty()
#如果队列为空, 返回True(注意队列为空时, 并不能保证调用put()不会阻塞); 队列不空返回False(不空时, 不能保证调用get()不会阻塞)
Queue.full()
#如果队列为满, 返回True(不能保证调用get()不会阻塞), 如果队列不满, 返回False(并不能保证调用put()不会阻塞)
Queue.put(item[, block[, timeout]])
#向队列中放入元素, 如果可选参数block为True并且timeout参数为None(默认), 为阻塞型put(). 如果timeout是正数, 会阻塞timeout时间并引发Queue.Full异常. 如果block为False为非阻塞put
Queue.put_nowait(item)
#等价于put(itme, False)
Queue.get([block[, timeout]])
#移除列队元素并将元素返回, block = True为阻塞函数, block = False为非阻塞函数. 可能返回Queue.Empty异常
Queue.get_nowait()
#等价于get(False)
Queue.task_done()
#在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join()
#实际上意味着等到队列为空,再执行别的操作
下面是官方文档给多出的多线程模型(官方文档果然是个好东西):
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
for item in source():
q.put(item)
# block until all tasks are done
2. Queue模块与线程相结合
简单写了一个Queue和线程结合的小程序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time
import Queue
SHARE_Q = Queue.Queue()
#构造一个不限制大小的的队列
_WORKER_THREAD_NUM = 3
#设置线程个数
class MyThread(threading.Thread) :
def __init__(self, func) :
super(MyThread, self).__init__()
self.func = func
def run(self) :
self.func()
def worker() :
global SHARE_Q
while not SHARE_Q.empty():
item = SHARE_Q.get() #获得任务
print "Processing : ", item
time.sleep(1)
def main() :
global SHARE_Q
threads = []
for task in xrange(5) :
#向队列中放入任务
SHARE_Q.put(task)
for i in xrange(_WORKER_THREAD_NUM) :
thread = MyThread(worker)
thread.start()
threads.append(thread)
for thread in threads :
thread.join()
if __name__ == '__main__':
3. 重构爬虫
主要针对之间写过的豆瓣爬虫进行重构:
3.1. 豆瓣电影爬虫重构
通过对Queue和线程模型进行改写, 可以写出下面的爬虫程序 :
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 多线程爬取豆瓣Top250的电影名称
import urllib2, re, string
import threading, Queue, time
import sys
reload(sys)
sys.setdefaultencoding('utf8')
_DATA = []
FILE_LOCK = threading.Lock()
SHARE_Q = Queue.Queue()
#构造一个不限制大小的的队列
_WORKER_THREAD_NUM = 3
#设置线程的个数
class MyThread(threading.Thread) :
def __init__(self, func) :
super(MyThread, self).__init__()
#调用父类的构造函数
self.func = func
#传入线程函数逻辑
def run(self) :
self.func()
def worker() :
global SHARE_Q
while not SHARE_Q.empty():
url = SHARE_Q.get() #获得任务
my_page = get_page(url)
#爬取整个网页的HTML代码
find_title(my_page)
#获得当前页面的电影名
time.sleep(1)
SHARE_Q.task_done()
完整代码请查看完成这个程序后, 又出现了新的问题:
无法保证数据的顺序性, 因为线程是并发的, 思考的方法是: 设置一个主线程进行管理, 然后他们的线程工作
4. 通用的多线程爬虫小模版
下面是根据上面的爬虫做了点小改动后形成的模板
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time
import Queue
SHARE_Q = Queue.Queue()
#构造一个不限制大小的的队列
_WORKER_THREAD_NUM = 3
#设置线程的个数
class MyThread(threading.Thread) :
doc of class
Attributess:
func: 线程函数逻辑
def __init__(self, func) :
super(MyThread, self).__init__()
#调用父类的构造函数
self.func = func
#传入线程函数逻辑
def run(self) :
重写基类的run方法
self.func()
def do_something(item) :
运行逻辑, 比如抓站
print item
def worker() :
主要用来写工作逻辑, 只要队列不空持续处理
队列为空时, 检查队列, 由于Queue中已经包含了wait,
notify和锁, 所以不需要在取任务或者放任务的时候加锁解锁
global SHARE_Q
while True :
if not SHARE_Q.empty():
item = SHARE_Q.get() #获得任务
do_something(item)
time.sleep(1)
SHARE_Q.task_done()
def main() :
global SHARE_Q
threads = []
#向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
for task in xrange(5) :
SHARE_Q.put(task)
#开启_WORKER_THREAD_NUM个线程
for i in xrange(_WORKER_THREAD_NUM) :
thread = MyThread(worker)
thread.start()
#线程开始处理任务
threads.append(thread)
for thread in threads :
thread.join()
#等待所有任务完成
SHARE_Q.join()
if __name__ == '__main__':
5. 思考更高效的爬虫方法
使用进行异步IO抓取
使用Scrapy框架(Scrapy 使用了 Twisted 异步网络库来处理网络通讯)
本文希望达到的目标:
学习Queue模块
将Queue模块与多线程编程相结合
通过Queue和threading模块, 重构爬虫, 实现多线程爬虫,
通过以上学习希望总结出一个通用的多线程爬虫小模版
1. Queue模块
Queue模块实现了多生产者多消费者队列, 尤其适合多线程编程.Queue类中实现了所有需要的锁原语(这句话非常重要), Queue模块实现了三种类型队列:
FIFO(先进先出)队列, 第一加入队列的任务, 被第一个取出
LIFO(后进先出)队列,最后加入队列的任务, 被第一个取出(操作类似与栈, 总是从栈顶取出, 这个队列还不清楚内部的实现)
PriorityQueue(优先级)队列, 保持队列数据有序, 最小值被先取出(在C++中我记得优先级队列是可以自己重写排序规则的, Python不知道可以吗)
雪忆, 如雪般单纯, 冷静思考.
原文地址:, 感谢原作者分享。
您可能感兴趣的代码第一只python小爬虫
互联网就像一张无形的蜘蛛网,网站就相当于在这张网的交叉结点。而网络爬虫就是这张网上的蜘蛛,它是一种程序,能够利用url链接在各网站之间自动穿梭并抓取所需数据。
学了python的正则表达式之后,我便迫不及待的想要找个应用玩一下,而网络爬虫就是个不二的选择。下面记录一下我写的第一只小爬虫,用来自动下载网页上的图片。
(操作环境:32位Win8系统,运行工具:python2.7.9+Eclipse.)
1、首先,每个网站都有一个URL地址,通过这个URL可以进入各个相应的网站。我们在浏览网页 点击进入其他网页的时候,其实就是打开其他网页的跳转链接URL。我们所看到的每个网页“背后”都有着很多其他网页的跳转链接,我们只需鼠标右键打开网页源代码即可查看到。
2、首先,我们用到的是python的urllib模块。其中有几个方法是比较重要的:
url.urlopen(url,data=None,proxies=None,context=None) &根据URL打开网页,返回一个句柄
url.urlopen()的对象有个方法:read() &用于读取网页源代码
url.urlretrieve(url,filename=None,reporthook=None,data=None,context=None) &用于从网页上下载数据到本地
我们首先用urlopen()打开一个网页,获得一个句柄;然后用句柄.read()获取网页源代码;再用正则表达式从网页源代码中找出各个图片的URL;最后用urlretrieve(URL,'XXX.jpg')下载图片。
代码如下:
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html1 = page.read()
return html1
def getImg(html1):
reg = 'src=&(http://img.{,110}?\.jpg)&'
imglist = re.findall(reg,html1)
urllib.urlretrieve(imglist[1],'1.jpg')
str2 = raw_input('Please input URL:')
html1 = getHtml(str2)
getImg(html1)
print 'Finish!'示例网页:/.htm
以上代码只下载了一张图片,但网页上所有图片的URL都已经找到 放在imglist里面,我们只要加上个循环就可以下载全部图片了。
代码很简单,主要是要获取到图片的URL。而图片URL的获取 是从网页源代码上用正则表达式匹配出来的。
每一个网页对应的源代码格式都会有点差异,所以我们从不同网页上下载图片,最重要的就是查看网页源代码,分析图片URL的位置,然后编写恰当的正则表达式把图片URL拿下来。
分享两个视频教程,一个是智普教育的淘女郎图片爬虫(/s/1ntj2AX7),另一个是中谷教育的小爬虫教学视频(/s/1nt63lR7)
我最初看的是中谷教学视频,初识网络小爬虫。后来看到智普的视频,最大的收获就是不小心知道了淘女郎的网址(/.htm)里面一大片MM的照片,正愁没个好网址来练手呢。然后智普在获取图片URL的时候用的是切片,这也是一种方法,但相对于正则表达式而言就显得太繁杂了。
感觉这个小爬虫挺好玩的,就是现在下载来的图片没什么用,下完了看两眼就都删了。在知乎、博客里面搜了python爬虫的相关资料,其实我这个小爬虫也太小了,根本微不足道,只是下载几张图片而已。爬虫的真正应用是在搜索引擎和爬一些供数据挖掘的源数据,稍微大只一点的爬虫应该是运行在分布式机器上的,而且能够熟练、有效地在各个网页中穿梭、抓取数据。任重道远,继续努力!
以下是我抓取整一个页面10个淘女郎的图片(将近两千张),首先获取10个淘女郎的主页链接,进入各个淘女郎的主页,然后再获取图片的URL进行下载:
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html1 = page.read()
return html1
def getImg(html1):
reg = 'src=&(http://img.{,110}?\.jpg)&'
imgre = re.compile(reg)
imglist = imgre.findall(html1)
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%d.jpg'%a)
print a,imgurl
strMain = raw_input('Please input URL:')
htmlMain = getHtml(strMain)
regMain = 'a href=&(/\d+?\.htm)'
urlSon = re.compile(regMain)
htmlList = urlSon.findall(htmlMain)
for html in htmlList:
html0 = getHtml(html)
getImg(html0)
print 'Finish!'示例网页:/json/request_top_list.htm?type=0&page=8
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
新手学python,写了一个抓取网页后自动下载文档的脚本,和大家分享.
首先我们打开三亿文库下载栏目的网址,比如专业资料(IT/计算机/互联网)/bl-197?od=1&pn=0,可以观察到,链接中pn=后面的数字就是对应的页码,所以一会我们会用iurl = ' ...
从放暑假到现t在,看了2/3的鸟哥私房菜,稍微了解了点Linux的基本知识,感觉还可以. 一直想学Python,可是因为考研什么的一直没开始,虽然自己断断续续看了基本的语法规则,但是没静下心来好好实践下.7月决定去惠普实训,才给了我这么个时间,不用备战考研,因为我放弃了这个独木桥,学了一周终于写出了自己的第一个爬虫. 参考了的视 ...
爬取百度贴吧的图片 分析贴吧源代码,图片所在位置是:&img class=&BDE_Image& src=“........jpg” pic_ext..... 所以正则匹配是: r'BDE_Image& src=&(.+?\.jpg)& pic_ext' (注:?表示懒惰匹配,如果不加?会造成匹配到一个 ...
python真是一门非常优秀的语言,非常适合初学者,也非常适合写一些原型程序.这篇文章总结了下以前做的各种和网络相关的东西:自动登录.提取信息.模拟点击.模拟上传.取号等等,多亏了python才使世界变得那么美好!
本次我们主要是模拟浏览器下载网页,学会了下载网页其他的下载图片什么的都是一样的套路.先上代码:#-*-coding:utf-8-*-''' C ...
(建议大家多看看官网教程:教程地址) 我们使用dmoz.org这个网站来作为小抓抓一展身手的对象. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建项目 (Project):新建一个新的爬虫项目明确目标(Items):明确你想要抓取的目标制作爬虫(Spider):制作爬虫开始爬取网页存储内容(Pipeline):设计管道存 ...
我还年轻 , 我渴望上路 ...
- &在路上& 引子 当Google创始人用python写下他们第一个简陋的爬虫, 运行在同样简陋的服务器上的时候 ;很少有人能够想象 , 在接下的数十年间 , 他们是怎样地颠 ...
纪念一下人生中的第一只爬虫,在云课堂里跟着一个老师写的,虽然很简陋 ~
老师视屏链接:/course/courseMain.htm?courseId=302001 用的 python 3.4 有些代码跟老师的不一样
作用:根据网址下载全部 .jpg格式的图片
前几天基友分享了一个贴吧网页,有很多漂亮的图片,想到前段时间学习的python简单爬虫,刚好可以实践一下.
以下是网上很容易搜到的一种方法: 1 #coding=utf-8 2 import urllib 3 import re 4 5 def getHtml(url): 6 page = urllib.urlopen(url) 7 html ...为了让评估结果更加准确,请注意以下操作:
完成实验后点击「停止实验」按钮
将代码提交到代码库
尽可能详尽的撰写实验报告
尽可能在实验操作的关键步骤截图
尽可能减少无用操作
尽可能高效的利用内存/CPU资源
评估课还在不断完善中,我们真挚希望你能通过我们提供的这个平台,找到更好的发展机会。
单线程python爬虫,爬模特图片
个实验豆,激活本课程需要消耗 2 个实验豆!
激活后可不限次数学习本课。
获取验证码

我要回帖

更多关于 python 多线程爬虫 的文章

 

随机推荐