- 在线时间
- 471 小时
- 最后登录
- 2025-8-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7655 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2877
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1160
- 主题
- 1175
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
#!/usr/bin/env python0 D& Z2 W/ R, H$ T) g; b
# -*- coding:utf-8 -*-
d! g) s0 U9 W"""( B3 U+ G) u; F& b( }: p
Python爬虫,抓取一卡通相关企业信息
* g# L* h3 o7 cAnthor: yangyongzhen
7 F9 r0 `# b/ r b) U( `; CVersion: 0.0.2
. q# S# k8 G* ?0 D5 D: HDate: 2014-12-14
# h% o8 H' b9 p# j3 _' Y$ [Language: Python2.7.5& ~" ]0 ]! f0 }" F1 k Y; c+ F8 Q
Editor: Sublime Text2
. z% _( {% S& u8 N"""
2 y b4 Q" V' [# C
a' m2 ?- t& h8 I9 }$ |3 l Yimport urllib2, re, string
. X e7 e8 D9 j+ s. k; `import threading, Queue, time
4 Y4 a+ X& l* P. j& rimport sys- T0 ]7 z p& N
import os
% _4 g$ k& y& a9 c1 {3 ~from bs4 import BeautifulSoup* w, ?/ @9 I: l; K9 i( @5 j+ R
#from pprint import pprint
( Z1 F0 p( G/ b x
( R+ y* s7 q/ mreload(sys)5 |, n* y" V# S; N) p- z, ]
sys.setdefaultencoding('utf8')" P5 A$ W6 A+ X, Y8 l7 F& S: [( t
_DATA = []
, q& |% |# U VFILE_LOCK = threading.Lock()
' Z2 G9 ~- G7 a' s8 J3 [2 {SHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
6 }* O! O0 @! r) H8 f p_WORKER_THREAD_NUM = 3 #设置线程的个数
* j& x5 R4 q" b9 n) G* g
0 X, V) L- g+ \8 [) K" H$ V_Num = 0 #总条数% {( A, g, x; j% W# Q6 G
class MyThread(threading.Thread) :! s4 @/ u3 T7 l
- r7 ~) x& e- Q: m' J" B3 C def __init__(self, func,num) :. G( ^; w- v! \( |9 J1 N/ {
super(MyThread, self).__init__() #调用父类的构造函数! B# y9 ~0 T, H
self.func = func #传入线程函数逻辑
6 T/ S1 t( \% g; g/ Y self.thread_num = num
4 C- K4 i- N5 d1 Z! B) b def run(self) :
) z) M8 r* r0 b3 \+ w; t8 r self.func()$ s1 Z. f# y6 H, H" Y' v8 u
#print u'线程ID:',self.thread_num
% ]- S* _- |" @2 S$ k8 {" j+ F
6 a! A3 I/ l+ i& J& A" wdef worker() :
- E, L" G/ E8 z3 g1 Y. K global SHARE_Q- \; x- `, O. ?1 Z. T+ z
while not SHARE_Q.empty():4 D/ L( {: u1 b7 z% W
url = SHARE_Q.get() #获得任务
& R% d1 }/ Y9 K' s. C8 ? my_page = get_page(url)
' i- L5 H$ E( J. u2 g3 ^* ? find_data(my_page) #获得当前页面的数据6 A0 a7 K) e. d8 y, R: R
#write_into_file(temp_data)
2 s$ S, Y* v" P' o- q, ` time.sleep(1)4 C8 d" s; F \5 D
SHARE_Q.task_done()/ d: o' B" P8 t) j; `4 F* q
- B1 o; i- M! c" \def get_page(url) :
: M% s: F' ]- l$ m/ D2 } """$ R. J8 o' W) ?3 h3 x) k4 o! a
根据所给的url爬取网页HTML
- y$ X- u( K, w. L4 R# ^' C7 n Args: , Y- q0 t! _$ q% K
url: 表示当前要爬取页面的url
. A; P" Y( z: _ Returns:
+ ~9 S6 w5 d2 ^$ _: G A 返回抓取到整个页面的HTML(unicode编码)
' ?, D% K" \' C7 h1 }% h5 D% t Raises:
( m' R- f( X# F8 j1 j URLError:url引发的异常9 i1 ? Q) }9 W' L: T: L, f- P. R
"""& B- M4 `' y J9 G+ y
try :* _: n+ @5 P: p @0 F4 M
html = urllib2.urlopen(url).read()" W* _) C; }0 g+ ]+ ^, h' T @( C
my_page = html.decode("gbk",'ignore')
# v9 X; `- c2 y/ E# ]* j* H #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')1 M0 I( t h1 ~8 y
#my_page = urllib2.urlopen(url).read().decode("utf8")
+ s( W2 q& `% E" J* `% R except urllib2.URLError, e :
& P4 B# C0 W+ o: i7 @: k! V( f if hasattr(e, "code"):7 H. T ~" T5 @* c A% a2 g
print "The server couldn't fulfill the request."0 i; y I: g) H3 _ F6 j" y$ k
print "Error code: %s" % e.code9 M" R; P8 j5 i R7 {+ F; b2 z
elif hasattr(e, "reason"):
+ F/ J/ q/ |, h( V print "We failed to reach a server. Please check your url and read the Reason"
7 y; V( Z5 ]$ J8 | print "Reason: %s" % e.reason
' \) x: B$ i: j$ O return my_page8 T' i/ r, C$ u9 c
6 F4 ^& p! G6 H4 G! edef find_data(my_page) :
4 k% P5 A+ F. g. Y: j4 _! a" G. g9 j """
) L+ J1 F' h% \, M1 ~# P 通过返回的整个网页HTML, 正则匹配名称
0 a2 O5 I# }7 s/ m6 ~/ m+ g5 h n1 s& w- \8 _
Args:. l: X) S. e8 I0 J3 b6 C% P- J
my_page: 传入页面的HTML文本用于正则匹配; I( @% N+ D* t) z8 ]- ~2 m
"""" @) ^: K! K- S
global _Num4 Y9 E _5 \) g9 V L' x. |- T$ F7 H
temp_data = []; G8 O; H- ~" b! J
items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;"): m- v# Q5 l& R# d
for index, item in enumerate(items) :
& ]% U1 w4 s4 l) Y5 G" ~ #print item' h; L) w" K- ~& n' Q+ D6 h0 F
#print item.h17 y# x: @1 z9 b& L( x) w! \
#print h.group()
: t" }0 v" n/ V; x. e #temp_data.append(item)( z+ l/ r" y, i( p, F- {* r5 L
#print item.find(re.compile("^a"))0 x+ [, @9 [6 `1 }3 d* J1 E
href = item.find(re.compile("^a"))6 t8 F, E+ L. n) j) W+ D
#soup = BeautifulSoup(item)4 n3 t0 z" q* [) S6 G u4 r+ t
#公司名称
7 g/ U- A% A' `6 ~ if item.a:
?, I9 B, s6 O' J( a' L4 F data = item.a.string.encode("gbk","ignore") L- t/ {+ { ^& T
print data
7 R) b3 b' l, k1 w0 e9 c/ k& @ temp_data.append(data)# [* D3 d* J) `
: U# x- }+ P( P, d
goods = item.find_all("div", style="font-size:12px;")
V4 t3 j6 j/ a f% g2 V+ V' z & {. c7 E) C! x
#经营产品与联系方式
" n8 W& ]* s4 P, j) ?! u8 @' H/ I) t for i in goods:
( \4 O4 ~; d0 U) Y: G4 b data = i.get_text().encode("gbk","ignore"). F# s7 h' D! y' K3 ]2 [ l
temp_data.append(data)
6 \/ e$ ?! s( U( E- |/ j+ x print data1 x9 z3 [0 f2 R9 |9 `, ]/ S
#b = item.find_all("b")
; D4 R. z% z& Q9 q8 ^4 ^ #print b' |. d1 q$ w2 H% }6 }% d2 C
#链接地址
4 @' _9 p$ q% q5 u pat = re.compile(r'href="([^"]*)"')
- G* C' T$ R) \ h = pat.search(str(item))
- U T% j4 Q+ j8 Z' y if h:
2 ?' N |. J4 b# \( V, G7 [ #print h.group(0)
) V: ] x: p9 j href = h.group(1)$ B" v6 ~" q0 \
print href4 t/ u2 f5 |/ [8 L; ?: a e+ q
temp_data.append(h.group(1))# x6 b7 r0 Z. J$ N, P1 Z5 W' n
5 E. u: [! r) t( T& t4 H
_Num += 1
6 g7 R7 t3 _1 r( T5 l, i; ]6 @ #b = item.find_all(text=re.compile("Dormouse"))
$ C$ f( B9 ]! K- o3 U #pprint(goods): I2 ?3 U) q4 I3 ~# b
#print href
" M) o& X: _# Z7 k #pat = re.compile(r'title="([^"]*)"'), ? Y4 Y$ Q, ?6 [& Q% t8 E
#h = pat.search(str(href))
+ X- {, ?9 h1 k: P$ s( E4 F; ~ #if h:1 {% T" r2 Y& L' ]0 T/ _6 T8 t
#print h.group(1)9 U; B: P( `- ?' s
#temp_data.append(h.group(1))4 T$ d1 `3 n+ Y% F& E
_DATA.append(temp_data)
W7 N* r1 E, B8 E
* l9 F9 ?% J( }, \! ?: @" p- C#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
3 l+ Z+ z6 _, k5 Q, ?#all_url = 'http://www.mzitu.com/all' ##开始的URL地址4 b/ A& q. V3 D0 U
#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
9 s) G' K( y, P2 E#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)1 c: Y: u1 w( z7 W [
# | Y% o- I0 j' j6 B7 A$ z# @8 C
def main() :
) y% U% R4 w" s( T- I global SHARE_Q( R6 K9 W# {' x; A
threads = [], s. ]2 a( a$ w9 _" r' _ G y
start = time.clock()
6 E9 u: Z/ W* N/ I( C( T# z7 c" k douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"+ Q" M$ p' [7 i2 C! J( y; b( l
#向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
0 S9 j* h C; ? }1 q for index in xrange(20) :
- Y) `- n/ c8 W7 Z8 L6 L* g0 ` SHARE_Q.put(douban_url.format(page = index * 1))0 L# \2 ], T7 u3 k+ v, \
for i in xrange(_WORKER_THREAD_NUM) :
1 b8 c9 D) `3 M! W% |$ h thread = MyThread(worker,i); k/ ^# _+ S8 s2 z
thread.start() #线程开始处理任务
, o/ ~, p# b6 y1 T1 L0 L# j$ K3 A7 E; e9 W
threads.append(thread) k9 [. w9 m9 J0 C& A1 V7 \
for thread in threads :1 D; k: d$ Q8 h: r! G# N: m
thread.join()7 e2 B' `( i2 w* b! M
SHARE_Q.join()$ z! Y% {( Y* M P( b
i = 09 S' q4 V* C5 j1 a* B8 h4 }
with open("down.txt", "w+") as my_file :* D* E/ N- I) B* {3 k
for page in _DATA :$ Y8 k" m% V, f; _! ?2 R
i += 1
; [; B6 t/ G3 `2 y for name in page:4 ^* V( v2 V8 g+ C7 e
my_file.write(name + "\n"). O6 ^ d/ f# f. V
R. p$ x( S& \
print "Spider Successful!!!"
( I \* r9 d8 a. q0 X7 | end = time.clock()
2 b4 D0 b& Y& [) |0 h5 S9 A print u'抓取完成!'
4 n$ b5 U, Z a# b* f6 u print u'总页数:',i
5 F" d$ {) G4 s7 H print u'总条数:',_Num V% }. z. h5 Q6 U% ^8 u
print u'一共用时:',end-start,u'秒'
4 ^- H. p3 g* q7 M
5 d8 S& Q8 A# q% Z+ ]if __name__ == '__main__':! @9 ^0 M7 q' O8 X
main()
m0 [. ?. Z2 q, d5 F; r! @( I. D& L1 c' t! O* \
}/ {! r3 {& ?. P; I# G- {- i P |
zan
|