#!/usr/env  python
#-*- coding: utf-8  -*-

import urllib 

import urllib2 

import random 

import requests

import os,sys 

import Queue

import threading

import time

import MySQLdb

from sgmllib import SGMLParser 

import re

queue = Queue.Queue()

out_queue = Queue.Queue()

num=0

class ThreadUrl(threading.Thread):

    

    def __init__(self, queue, out_queue):

        threading.Thread.__init__(self)

        self.queue = queue

        self.out_queue = out_queue

def run(self):

        while True:

            


host = self.queue.get()


print host


try:


html=requests.get(host)

result=html.content


html.close()


self.out_queue.put(result)

#place chunk into out queue


except:


print time.sleep(5)

#signals to queue job is done


self.queue.task_done()

class DatamineThread(threading.Thread):

   

    def __init__(self, out_queue):

        threading.Thread.__init__(self)

        self.out_queue = out_queue

def run(self):

        while True:

            


result = self.out_queue.get()


pattern=re.compile('<div class="appdiscrib">[\s\S]*?<h4>(.+?)</h4>')


data0=re.findall(pattern,result)

pattern=re.compile('版 本 号(.+?)</li>')


data1=re.findall(pattern,result)


pattern=re.compile('开 发 者(.+?)</li>')


data2=re.findall(pattern,result)


pattern=re.compile('发布时间(.+?)</li>')


data3=re.findall(pattern,result)


pattern=re.compile('文件大小(.+?)</li>')


data4=re.findall(pattern,result)


pattern=re.compile('支持固件(.+?)</li>')


data5=re.findall(pattern,result)


pattern=re.compile('应用介绍</h3>[\s\S]*?<div class="intro">([\s\S]*?)</div>')


data6=re.findall(pattern,result)


for items in data6:


pass#print re.sub('<br />',' ',items)


sql="insert into address(name,version,developer,pubtime,filesize,support,introduction) values(%s,%s,%s,%s,%s,%s,%s)"


for items in data6:

if(data5):


values=(data0[0],data1[0],data2[0],data3[0],data4[0],data5[0],re.sub('<br />',' ',items))


else:


values=(data0[0],data1[0],data2[0],data3[0],data4[0],'NULL',re.sub('<br />',' ',items))


#print values


#print sql % values

try:

conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',db='addressbookdb',charset="utf8")


cursor=conn.cursor() 


cursor.execute(sql,values)


conn.commit()


except:


print "error2"

try:


cursor.close()


conn.close()


except:


print "error3"

pattern=re.compile(' <div class="appTitle clearfix">[\s\S]*?<img src=(.+?)/>')


data=re.findall(pattern,result)


for j in data:


print j


global num

      


try:


temp=requests.get(j[1:-2])


f=file("picture/"+str(num),"w+")


num=num+1


print num


f.write(temp.content)


except:


print "error4"


 

           


self.out_queue.task_done()

def main():

for k in range(1,2539):


print k

try:


url="http://apk.gfan.com/apps_7_1_"+str(k)+".html"

html=requests.get(url)

result=html.content


html.close()


pattern=re.compile('<a href="([http://apk.gfan.com]?/Product/App\d{1,8}.html)"')


dataresult=re.findall(pattern,result)


dataresult=list(set(dataresult))

for a in range(20):


w = ThreadUrl(queue, out_queue)


w.setDaemon(True)


w.start()


for i in dataresult:


host="http://apk.gfan.com"+i

queue.put(host)


for a in range(20):


dt = DatamineThread(out_queue)


dt.setDaemon(True)


dt.start()


except:


time.sleep(5)

queue.join()


out_queue.join()

#sql="select * from address"


#cursor.execute(sql)


#conn.commit()


#finalresult=cursor.fetchall()


#if finalresult:


#for x in finalresult:


#pass #print x[0:]

if  __name__=="__main__":

       main()

python多线程抓取网页信息的更多相关文章

  1. python 处理抓取网页乱码

    python 处理抓取网页乱码问题一招鲜   相信用python的人一定在抓取网页时,被编码问题弄晕过一阵 前几天写了一个测试网页的小脚本,并查找是否包含指定的信息. 在html = urllib2. ...

  2. PHP利用Curl实现多线程抓取网页和下载文件

    PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...

  3. HttpClient+Jsoup 抓取网页信息(网易贵金属为例)

    废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...

  4. php curl_multi系列函数实现多线程抓取网页

    最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名. 在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜 ...

  5. python 处理抓取网页乱码问题一招鲜

    FROM: http://my.oschina.net/012345678/blog/122355 相信用python的人一定在抓取网页时,被编码问题弄晕过一阵 前几天写了一个测试网页的小脚本,并查找 ...

  6. python 解决抓取网页中的中文显示乱码问题

    关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换.还包括一些如日文.韩文 .俄文.藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明. 网络爬虫出现乱码的原因 源网页编码和爬取下来 ...

  7. .net抓取网页信息 - Jumony框架使用1

    往往在实际开发中,经常会用到一些如抓取网站信息之类的的操作,往往大家采用的是用一些正则的方式获取,但是有时候正则是很死板的,我们常常试想能不能使用jquery的选择器,获取符合自己要求的元素,然后进行 ...

  8. python分布式抓取网页

    呵呵,前两节好像和python没多大关系..这节完全是贴代码, 这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧. 对于编码格式确实搞得我头大..取下来页面不知道是什么编码,所以先找c ...

  9. python 多线程抓取动态数据

    利用多线程动态抓取数据,网上也有不少教程,但发现过于繁杂,就不能精简再精简?! 不多解释,直接上代码,基本上还是很好懂的. #!/usr/bin/env python # coding=utf-8 i ...

随机推荐

  1. Java 中关键字transient引出序列化与反序列化

    一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...

  2. js工厂模式

    设计工厂模式是为了创建对象.通常在类或者类的静态方法中实现,具有两个目标.其中一个是:当创建相似对象时执行重复操作: 另外一个目标是:编译时不知道具体类型(类)的情况下,为工厂客户提供一种创建对象的接 ...

  3. Windows单击右键没有共享选项怎么办

    文件共享是指在网络环境下文件.文件夹.某个硬盘分区使用时的一种设置属性,一般指多个用户可以同时打开或使用同一个文件或数据.但有时候也会遇到找不到共享选项的情况. Windows单击右键没有共享选项怎么 ...

  4. python 远程统计文件

    #!/usr/bin/python #encoding=utf-8 import time import os import paramiko import multiprocessing #统计文件 ...

  5. vim 删除临时文件

    今天在用Xshell连接到CentOS后 使用vim 编辑文档 因为中途有事  临时关闭 并没有保存 再一次打开时 vim 提示要恢复 , 但是每次打开文件后到要恢复,于是找到了以下办法 和vim工作 ...

  6. hdu 1853 最小费用流好题 环的问题

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others) Tota ...

  7. 【转】 ubuntu下fastboot找不到devices

    原文网址:http://memory.blog.51cto.com/6054201/1202420 转载补充: 1.首先,手机必须先进入bootloader状态,fastboot devices才能有 ...

  8. 关于qt学习的一点小记录(2)

    嗯...这次接了个单 要求图形界面,刚好可以巩固并学习下QT.毫不犹豫的就接了 下面记录下出现的问题: 1. QWidget和QDialog QDialog下的槽函数有accept()与reject( ...

  9. OpenstackHigh-level-service

    1,yum -y install openstack-cinder;

  10. 【jquery插件】-网页下雪效果

        又到了年底,从圣诞节开始,可以发现各大网站的活动是越来越多,都变的银装素裹,本人由于业务需求也需要做这么一个效果,所以就通过google大神找了一下相关资源,结果就出现了N种雪花效果的方式.种 ...