- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
#!/usr/bin/env python
7 n, s7 j5 J/ Q: t( @' z+ h# -*- coding:utf-8 -*-. `+ z& i8 w4 B( P! Z
"""( P; z# _; m+ k+ g! X# u" y
Python爬虫,抓取一卡通相关企业信息/ S& M5 ^0 j7 q
Anthor: yangyongzhen$ O4 e& Y4 g* _) j6 H
Version: 0.0.2
s4 Y" j6 B; c$ P) aDate: 2014-12-14# s, W8 V$ X+ }( J
Language: Python2.7.5/ Q( l, d2 c* Q, D
Editor: Sublime Text2
# W* R% S1 d1 |"""' d3 |- \' ~+ J3 H3 H
: H& o+ }/ V, w W3 x5 simport urllib2, re, string/ b @2 h' ^ Q. l
import threading, Queue, time
/ Q" E2 L3 v7 K8 w: w5 P! Cimport sys
5 {7 U+ w2 F6 @) h* }import os {' R" t/ G/ L4 c; l
from bs4 import BeautifulSoup- Q d' t2 e1 O* X6 L: a" W
#from pprint import pprint
, u5 w) s) z/ g) V. ?- U9 l! y8 R7 T, `: ^* Z. S2 m
reload(sys)' l% K9 a) B# X+ ~) o4 @% Z
sys.setdefaultencoding('utf8')
( k5 w* c( H- R# d0 m+ q3 c4 u+ L_DATA = []
: a9 K4 r9 J$ `; FFILE_LOCK = threading.Lock()
2 ?( L# `) T1 c' Q; CSHARE_Q = Queue.Queue() #构造一个不限制大小的的队列: u5 h5 G: ~9 W& }6 [
_WORKER_THREAD_NUM = 3 #设置线程的个数
. v8 k8 B4 s) F; C2 {
9 i$ C( L9 M$ z3 {0 q_Num = 0 #总条数2 y/ G3 r: |" u
class MyThread(threading.Thread) :6 S% O3 F' b) D y" K, Z
- j, L+ M: U0 R. {$ `# l# d6 L
def __init__(self, func,num) :
( U2 Y v- P- D super(MyThread, self).__init__() #调用父类的构造函数
4 K" x( O3 z5 _) G) z: W self.func = func #传入线程函数逻辑
+ q4 c7 r4 @; Q. M self.thread_num = num 1 g% z, N' F1 q; R3 J. U* f& i
def run(self) :8 g9 {" G$ w) B1 J- x
self.func()
+ r, X, K$ F3 X6 ^ #print u'线程ID:',self.thread_num( R2 v3 d# d4 A( v
1 D0 Q) X+ m$ j3 ?, S" j4 n: @def worker() :: E7 R8 p4 t3 [- ?; m
global SHARE_Q) S. J2 H. D, D/ b/ n
while not SHARE_Q.empty():* e( m2 L2 Y1 K5 ?
url = SHARE_Q.get() #获得任务2 V* [$ w L3 M, E
my_page = get_page(url)9 t/ c! O( p h) S2 v$ O( x
find_data(my_page) #获得当前页面的数据/ G. p. g3 G! h7 }, X- y9 X8 @
#write_into_file(temp_data)
- L& z9 ~& @1 o! J, f- Q3 h) i. s time.sleep(1)
; E1 @- G2 }2 |) i: G SHARE_Q.task_done(): S: ^, ?: L& j) _. q- U7 p% f% \
! H' S4 a1 b; W. C- F" a1 s: Y0 F
def get_page(url) :+ o p* _, C' E" K5 @5 O& e
"""
: q4 R! j2 l' |# }# o( c \% a 根据所给的url爬取网页HTML
- u. ? L. s# \ Args:
1 g1 D# g* m0 d$ ^ url: 表示当前要爬取页面的url
& ^- U2 |/ g( g1 ^& X+ M Returns:, ] r$ |0 [% l5 m7 i' k
返回抓取到整个页面的HTML(unicode编码)3 V5 u! D, x- n3 \/ `' ^
Raises:
i5 h+ C {% b) T* a) x4 i& ` URLError:url引发的异常
( S. \8 F% N' b1 c( i0 @# { """
0 M) Z# s) J6 I+ r6 x try :, a4 b- W" y k
html = urllib2.urlopen(url).read()
f' ~, t4 w7 K' ?9 E) ~ my_page = html.decode("gbk",'ignore')
% F" k0 U1 _& o8 [% l& w$ A- x' o #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')8 {/ L0 U5 N1 n; w& P s) U$ T
#my_page = urllib2.urlopen(url).read().decode("utf8")
6 S) u- [6 J C0 l4 F& h4 K8 Y except urllib2.URLError, e :
) d( S K$ K- f# A if hasattr(e, "code"):- i- N4 n0 I7 k
print "The server couldn't fulfill the request."
1 W4 f/ A; ^/ Y+ U2 M2 o print "Error code: %s" % e.code7 @0 _ [4 t$ y7 Y: y- C
elif hasattr(e, "reason"):, j0 g% ~- \) q/ m
print "We failed to reach a server. Please check your url and read the Reason", C+ i$ \2 l1 g/ ?% F% M! v
print "Reason: %s" % e.reason
! i- Q4 {/ ^0 \% A5 h return my_page. x0 c" f* m2 x" T
9 `( `& Q, f' W# n( L9 k
def find_data(my_page) :7 G5 s3 F0 `$ h; C& _
"""
: p# m8 [3 C! ?. h8 E8 ]& w5 A. I 通过返回的整个网页HTML, 正则匹配名称5 M; `# @4 H7 f. A* D9 M5 b
3 N' V3 y Z) E5 i3 N
Args:
& M; ^* h) J5 U- i my_page: 传入页面的HTML文本用于正则匹配7 t# J) J0 w7 I* y. w5 i# d
"""+ ]$ f) X# w" G
global _Num4 g, I- w0 d( r8 \) {, V
temp_data = []* {& T& s; x6 l% J
items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
9 R' i# q( M& K9 O( g4 Y for index, item in enumerate(items) :' I& r+ D1 J9 }" u# Q+ A
#print item
0 D, E* S, d3 z* ?! [ #print item.h1% R9 v% v' }7 _# N
#print h.group()
! X' J' n: v/ m9 g* K! O& o #temp_data.append(item), L0 D( D' ?* m
#print item.find(re.compile("^a"))- f* ]4 h4 ?2 x" t
href = item.find(re.compile("^a"))
L5 m T4 M& \ #soup = BeautifulSoup(item)
0 r {6 [6 Q5 }% I2 w3 \6 A; { #公司名称
. c2 s6 Z1 Z4 [2 o+ d if item.a:
6 r* ~: h/ b U3 W( v. T data = item.a.string.encode("gbk","ignore")- A/ \ X! z! J) m7 I4 g
print data
3 B6 t& P! j! e5 K9 W temp_data.append(data)
6 J# ^) }2 X' ] n- d, O, h2 e( b
' I# ?- S9 m# o* ]: [( i goods = item.find_all("div", style="font-size:12px;")
2 k& S4 x0 f P7 |: w( [$ I
3 @$ y r- m; Y. [5 k8 _ #经营产品与联系方式& T7 \: @" k/ p/ |0 f
for i in goods:% V9 Q% Q5 X4 D, ?& a& L6 S
data = i.get_text().encode("gbk","ignore")& o' [1 n: L Q% d- T" Z( b
temp_data.append(data)
2 P( t: A4 U$ I- Q& M3 C# ?+ q print data0 k* R* H- w5 [
#b = item.find_all("b")
# Y1 ]' P3 A) @" E2 B# w& n8 s #print b# U3 L3 Y& L, ?: a- I! W! B% n6 ~
#链接地址: Q: p$ p/ ]# A. g( o0 q! e+ V
pat = re.compile(r'href="([^"]*)"')* O8 s0 }0 [" Y) n# \
h = pat.search(str(item))
: }: W7 b; }6 v1 N4 X if h:
% m' H4 [9 Q3 k$ m3 Z7 U$ g #print h.group(0)
* [& N3 X' J8 t! _; B href = h.group(1); t/ i7 \' M7 Q. K
print href& d; k1 i9 Y. `0 ~8 i2 r
temp_data.append(h.group(1))6 i3 ?' ]( N$ W* i0 V% u0 F3 P' g0 {
6 r& r, f/ k# X2 t" C! M" d _Num += 1
; ]8 P; G$ Q2 F0 ]+ j+ b #b = item.find_all(text=re.compile("Dormouse"))! H+ w, _& m/ ]% p
#pprint(goods)
% Z w. P! }/ j/ N% N' A) x #print href
) p, v$ F2 q! V #pat = re.compile(r'title="([^"]*)"'), }. U6 B( m% X8 P
#h = pat.search(str(href))/ {! e8 R+ [* w
#if h:
" V9 T/ N7 f* o" _4 T #print h.group(1)5 c P! J, B! e' l& N
#temp_data.append(h.group(1))
6 n# M' h4 _6 V+ [* V9 m _DATA.append(temp_data)
9 j: g1 Z! p* u6 [6 o6 p
+ \* f+ K9 _& ^ m0 j) \3 t$ ?0 o0 D#headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)! D# e+ @; \7 C; }2 x Z, r, f
#all_url = 'http://www.mzitu.com/all' ##开始的URL地址
7 h% Y3 `& `/ y6 r#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释/ c% N0 _# ~7 s0 e4 l
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)( p; w$ o+ i$ u6 {1 [! v# p
4 R5 ~+ N# h$ l) w2 Rdef main() :
8 A4 b5 z" _# I4 T& Q2 [: X. P0 O global SHARE_Q
! b6 d4 `9 C7 D' n& h. E/ _ threads = []8 p; W4 F: z5 H- a4 r
start = time.clock(), H% P' _* l% J; [2 \* ?. z
douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
9 o* I5 o8 X* W; C; | #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
7 H/ x" P. a0 E- s for index in xrange(20) : + _7 Q+ T( P/ Y$ C) ^
SHARE_Q.put(douban_url.format(page = index * 1))
/ G% w; a7 E1 h+ a& V5 k for i in xrange(_WORKER_THREAD_NUM) :
+ U3 B, V& v6 K: A* S+ s! d: D thread = MyThread(worker,i)4 X$ }5 r! g$ \/ r
thread.start() #线程开始处理任务
( {7 C7 l; ]5 p: E+ n" P) l W: b5 n# [
+ ] _* ~; t* A/ E threads.append(thread)
. s% t, A/ m3 H3 d for thread in threads :0 N3 m0 }7 U1 O& _& R
thread.join()' c* w/ ~3 O0 v; ~* w9 A
SHARE_Q.join()
# t, l- i- S( T7 Q8 D. W i = 0
$ e. I/ Y, C# S with open("down.txt", "w+") as my_file :+ T$ S+ Z* B1 H3 h
for page in _DATA :
: V, K( |$ m* x i += 1
d& B! K4 J- R. `3 F for name in page:, t. [/ D! h; w0 `9 Q5 N
my_file.write(name + "\n")6 H( a0 d) A) u) B; |# m
. ~' p5 g% n/ ?' i print "Spider Successful!!!"7 U' L, x- f& ]6 F9 {
end = time.clock()% F8 o5 j5 F$ j* h5 K. c
print u'抓取完成!'
9 \! j+ G! C9 w5 Z9 i, O* ~2 P& c print u'总页数:',i
& G, a% E4 J4 H' t4 x! g print u'总条数:',_Num
" v* y2 f: _) ^2 E! y1 v print u'一共用时:',end-start,u'秒' {% F' x, `. [% L U9 s: v
$ G7 q7 Q9 A+ f: |
if __name__ == '__main__':$ O9 j3 D @8 E ~' d$ U
main()( o5 s1 d0 x q) L
/ k G: k- J @, O9 X2 w+ b) _6 D% U/ `2 \- ~9 X* F( |
|
zan
|