- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
#!/usr/bin/env python! C/ { U5 d/ R1 s- z% d
# -*- coding:utf-8 -*-
6 D2 l( V- U$ p3 Y; E% H"""$ \. Y' ~& ~, d& j
Python爬虫,抓取一卡通相关企业信息
! ]& J+ o8 r3 EAnthor: yangyongzhen( p9 Q( @. t6 Z3 v
Version: 0.0.2( N. {) Y. v; p. b# Z
Date: 2014-12-14
+ z. m- r9 E. m' P7 |' s; \; L8 uLanguage: Python2.7.5
0 L- ^& c+ u. e# V# rEditor: Sublime Text2' _. w: w* N3 I5 P3 Z1 V# ?% R5 `' Y
"""2 K# H( |; M; Y9 ~& H
( a+ |- s2 s# k6 y9 W% R5 jimport urllib2, re, string
; E) s5 z5 _ g+ f4 N* @7 P% Qimport threading, Queue, time) [! [, R$ Y: m5 Q$ h1 _; J
import sys/ H' _ `5 N/ `( j6 e4 g
import os
& W! k/ @$ ?3 L, V0 Efrom bs4 import BeautifulSoup
4 a. d6 C t( |# x- f7 Z: A" { w#from pprint import pprint
/ {) O$ s3 v# F: I S# N) M0 c8 c# v
reload(sys)
0 U- D8 ]* [ Q/ r. t1 rsys.setdefaultencoding('utf8')% ~1 {' `9 G5 {1 b) b3 @6 u8 F$ z
_DATA = []
) l" a8 q! w/ D* {FILE_LOCK = threading.Lock()
' [ B5 d* e* I6 q8 G# a6 ?$ z1 l HSHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
" |7 j {. R9 p3 C) z_WORKER_THREAD_NUM = 3 #设置线程的个数, V/ G- U4 y) y8 V) ?7 g. I8 a
, {! O# y& y# t_Num = 0 #总条数
- q$ \; ]% t5 t: t' P$ z" Nclass MyThread(threading.Thread) :" G& i6 l& \- \* T3 S( u: s6 S
; s% G) \5 _$ x: c def __init__(self, func,num) :- e( r9 K4 W- T0 x
super(MyThread, self).__init__() #调用父类的构造函数
" L! E9 F) c' L self.func = func #传入线程函数逻辑1 {3 l: \1 l# m: |9 c
self.thread_num = num " N3 X; ~5 o* U# b% t
def run(self) :
. Q8 R7 W2 a9 s2 u, X, Q+ j self.func()5 H- m L# W- W$ i2 p! e' u) g: D, z
#print u'线程ID:',self.thread_num
! D( `: V) m9 t5 Y/ ^& @
5 n, l# k) k: v! E( [def worker() :, Z! _* E! E7 }+ r( F& Q
global SHARE_Q
4 t1 C( Q# M$ i3 ^ while not SHARE_Q.empty():
. Q, T! W& a! r url = SHARE_Q.get() #获得任务
: m$ y: [+ r: T( k. q my_page = get_page(url)4 j7 i; f& r: ?- `, n5 b( i) N
find_data(my_page) #获得当前页面的数据
& \4 V, |3 ^& W2 L/ i+ k #write_into_file(temp_data)
! E: S) k. T" i. }+ W& K/ c time.sleep(1)$ M4 B: g% x4 m9 o
SHARE_Q.task_done()" r+ p" M! P) ~$ z) G
# t7 T7 A2 s; d6 W/ H/ l
def get_page(url) :
8 I( r- v* [4 y% z% ]2 i4 e- ~) U """5 `* J/ {: S* K4 Y( X1 e' R% q \4 |
根据所给的url爬取网页HTML" P/ k% D- {' S8 o& Q" w* V5 Q+ A
Args:
* u1 M$ Z. i) N' g" g4 n url: 表示当前要爬取页面的url0 J- @' a( b# f+ `: _
Returns:
( K% i9 O4 y! M7 T 返回抓取到整个页面的HTML(unicode编码)
+ n1 ^0 h5 N0 E Raises:
5 b+ E8 j1 y4 E) U9 F& g, n URLError:url引发的异常
# k& L8 x& P6 O" P! C+ G """
( x$ F! Q U- ?& Q5 I; | try :
j4 T1 q" D! c3 o9 y% d html = urllib2.urlopen(url).read()
2 `# ?3 ]0 S) S3 J" d7 M' N my_page = html.decode("gbk",'ignore')' ~& O: e, j, O' ~4 ~
#my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
6 J! G' q+ P( D. f; Z" l #my_page = urllib2.urlopen(url).read().decode("utf8")
- g M2 C2 K3 O: G7 X# b except urllib2.URLError, e :
# M( M. @: g! T3 u7 d if hasattr(e, "code"):
1 r5 s. T( m$ L+ |) K2 S& G print "The server couldn't fulfill the request."" L# m5 P) m, K$ L
print "Error code: %s" % e.code
) k0 x2 O" i! g, C- p elif hasattr(e, "reason"):$ j+ b( d7 d+ v% k9 _+ h
print "We failed to reach a server. Please check your url and read the Reason"
* |6 j; n- l4 X: ?2 i8 x0 T8 _ print "Reason: %s" % e.reason
E2 U9 K( g3 f, @4 E8 i5 P8 L return my_page
" }7 j( E! o9 B) \
3 a: @& E6 L9 g Y1 |% X1 mdef find_data(my_page) :7 k5 X2 x+ Y; N0 ]3 q
"""* V- v, ~8 E* R
通过返回的整个网页HTML, 正则匹配名称: j9 u$ X: A1 y0 N% s
! T# _5 e; D+ Y. \1 ?, y& B6 n: y7 r4 W Args:6 c; y! j! O+ t" l* B
my_page: 传入页面的HTML文本用于正则匹配
( J3 o: B- Z( m2 ~/ { """
: H7 |7 c, K9 w4 ?6 b4 Y1 s7 h) F global _Num9 T: v7 |3 u8 {5 Q- B
temp_data = []
) L5 |$ G a: ~5 O" V" X6 B4 \3 L* G items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
2 `) e! {6 z# \% i. u for index, item in enumerate(items) :8 L b H4 c* a4 J- o3 t6 c
#print item' R2 q% ^ G! _# g: d) ?2 ~. r
#print item.h1( y2 Z3 x2 e- m7 S, Z6 P0 ~
#print h.group()
) R3 b$ ~* C8 _( v* x #temp_data.append(item)) m3 G& N+ C7 ~$ o% L" J4 n7 g- v& S! @
#print item.find(re.compile("^a"))
+ \, E6 B2 H2 L; Q href = item.find(re.compile("^a"))
( W/ m0 U6 n3 C; G, d- S$ @ #soup = BeautifulSoup(item)
/ H9 O; s9 g4 T" q #公司名称
, s3 d( o$ X+ d# E if item.a:
) p- Y/ @ a- f" W+ p, ]* \7 k data = item.a.string.encode("gbk","ignore")) V1 v/ O' u4 N- T! ]
print data7 }# i9 N! t1 {, ^1 L) }
temp_data.append(data)
5 x w/ |2 ^/ w3 L" q; [% l6 d' H `1 O- J; j d6 E; ?% t0 Y
goods = item.find_all("div", style="font-size:12px;")
. S, T ?6 w) M
) r& c7 B7 c5 `) s3 f* U' M #经营产品与联系方式
9 N! Y' g! }8 B! K1 M6 o6 h for i in goods:
8 b$ j/ v* i! L) B. @. M/ y. b data = i.get_text().encode("gbk","ignore")
4 N( |7 Z5 o% e9 V temp_data.append(data)
! B0 d: H* A6 q+ R0 r T print data% g6 Z! ^. X, r0 M" ^! w* ~
#b = item.find_all("b")- m: \: m3 }7 \4 u. V. Q# ]
#print b
# e8 n( N# |& x) l7 W* U; c a #链接地址
, N* H- p4 y8 S pat = re.compile(r'href="([^"]*)"')
% ]' x: o% H3 c Z: R2 K9 L' Y/ r/ A h = pat.search(str(item))5 R1 w( k+ B. G; Q
if h:
% ]4 u( a+ D X4 R1 }( I #print h.group(0), F7 `+ ]/ |* D1 j! s+ W
href = h.group(1)
% T0 w! r2 w% D8 } print href( o1 _, `% C" S4 y5 o2 V5 B0 x
temp_data.append(h.group(1))* n8 u2 m/ P+ k \& u# b' B
5 D- {; B8 D' b0 Z
_Num += 11 h" T t3 d: Y, a) r
#b = item.find_all(text=re.compile("Dormouse"))1 [" l, a- P' o+ T
#pprint(goods). e$ J% c" m8 R
#print href6 C$ c4 B9 n0 ~" D8 r. q. d. E4 A
#pat = re.compile(r'title="([^"]*)"')1 I2 u% e- [1 d! z( r. _4 M
#h = pat.search(str(href)); ?# N8 r$ C1 ?7 ~
#if h:& Z/ f: N2 n8 g0 a
#print h.group(1)' b2 k: C+ \4 ?, {: t: u; c
#temp_data.append(h.group(1))
+ c: d7 u- B3 Y; k& I, r3 g3 D _DATA.append(temp_data)& }) F/ k% H) c' I3 a' G2 ?" t: T6 T4 g* v
0 @/ g* C! L8 n0 Y#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
9 ^& ~9 G& B1 i* E0 g0 U. k#all_url = 'http://www.mzitu.com/all' ##开始的URL地址
# ^9 U. B1 @8 l0 G; u6 ~/ _#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释, ~: B$ h2 E( e
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
7 B/ H8 L! w0 d
2 ~6 g; A( ?0 \. u z1 I' bdef main() :
6 ]+ V4 u' h0 S) p) b$ M global SHARE_Q
" D4 U' y6 j& \* L0 h q threads = []
: K" X% M) T c2 h6 E start = time.clock()
+ ]) d1 O& z7 b0 h douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"" e2 i5 h4 q- u1 h
#向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
( F. \$ c ?& x( a for index in xrange(20) :
$ Q4 l# i0 o3 v9 X SHARE_Q.put(douban_url.format(page = index * 1))$ p/ @3 Q; H! \; e- f2 R, }7 z' A9 \
for i in xrange(_WORKER_THREAD_NUM) :
* ^, o+ P' Q' @- z thread = MyThread(worker,i)
9 y' k% S8 W& c0 O5 W# \ thread.start() #线程开始处理任务0 v, e9 I/ s9 o, D: A4 P
' z8 ^9 `; N0 J threads.append(thread): @1 n# v. O3 w. Y% X* f7 L
for thread in threads :
- _3 C6 \$ U# M3 X( a2 e thread.join()
4 ^) ?! [: Q6 G: T# [9 [$ i6 g; N SHARE_Q.join(). _) W9 o ]% ^9 H/ V$ L0 w+ s' o
i = 0
4 ?2 O7 y: g$ ]" U, J- m. { with open("down.txt", "w+") as my_file :/ B, h5 W. M; I1 }' w# `0 ~1 O
for page in _DATA :2 v/ F6 \3 |1 \
i += 1
6 k% _& @3 s% F for name in page:
* c2 R- ?. E% W; Y+ s N my_file.write(name + "\n")
( @* k( K- h( @" b: ?" u4 f8 h" }; b0 c' h6 J
print "Spider Successful!!!"
: V: o0 G. Z0 ~( y% F1 M6 t end = time.clock()
; z2 A6 ~* Y* `8 H+ F" j* Q print u'抓取完成!'
1 g h; s6 w) M print u'总页数:',i
( J9 G/ {; V& Y% L# ~1 R9 q. T print u'总条数:',_Num; w& W" d" O1 T) [2 T+ g5 Z
print u'一共用时:',end-start,u'秒'
( I' i- K3 n5 ]- ~' N8 l$ ~/ [$ |/ x7 R
if __name__ == '__main__':
# _$ @0 ~% j; {+ l7 ^% z% \) } main()8 q4 ~7 o$ Z! n' w6 Y! t) T
: w; y! R; B, G0 y( L9 u
' q- g3 {1 Y( O1 @ |
zan
|