- 在线时间
- 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
: S" F/ i' u* S# -*- coding:utf-8 -*-/ g* H0 G+ u+ ~9 `2 d# g" r6 \
"""
P* p6 Q' G& G! s! B$ ?Python爬虫,抓取一卡通相关企业信息 x$ j2 X# O; {. o
Anthor: yangyongzhen
% y/ h% S- G& ~! N2 ZVersion: 0.0.22 ~$ a, e& G2 E7 j& k8 N
Date: 2014-12-14
, X" w6 { S0 y6 w. I$ OLanguage: Python2.7.5# v3 W( E5 M. d
Editor: Sublime Text2
8 y, Z) e+ b/ y" E1 |"""
" _1 q+ t# b3 v- }
7 y4 Z r2 ]3 F/ R0 r V1 U; ximport urllib2, re, string
- G/ B3 O4 M: i8 kimport threading, Queue, time
4 w# E4 ?! D1 j, U( j2 fimport sys# ~ {7 K& Y' L' ]/ N9 A- F" I
import os
+ P K8 V# c/ e8 R5 sfrom bs4 import BeautifulSoup
. q/ Y9 r: b: `: P& h#from pprint import pprint
0 w, L' n' A* i( V
. b+ U5 {# `# X, W# d4 V+ Sreload(sys)2 A! Q" B- H* D# p- T2 U8 S
sys.setdefaultencoding('utf8')7 \$ l) s1 w8 Q, d
_DATA = []% O- I4 m1 a0 A, n f; W
FILE_LOCK = threading.Lock()6 j4 q" U, R4 c& [# {
SHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
T L9 o/ z0 K% q9 n2 K* \- W_WORKER_THREAD_NUM = 3 #设置线程的个数
# N. m& a" B# X3 Z# E: R, K
( Y0 t& t4 k. s_Num = 0 #总条数4 k+ Y/ V* T" F9 @2 M
class MyThread(threading.Thread) :
g) @/ s( e; g% A% Y j; @2 D" S. t; U4 @! W' V
def __init__(self, func,num) :
5 P& \* H5 \$ ]% h super(MyThread, self).__init__() #调用父类的构造函数
7 \! {) f8 A+ K, F4 O9 c self.func = func #传入线程函数逻辑
2 H$ a* L5 V- ?, J h self.thread_num = num # B8 V3 @8 S7 |% }3 P2 s; j; M: |
def run(self) :
/ ?7 }, L1 W/ w1 _3 G self.func()+ B$ o0 G4 s1 F, u# J
#print u'线程ID:',self.thread_num
) {9 |. v- T! r0 i/ c a7 Y2 [2 P
+ e) J+ B1 ?7 q) `def worker() :
( P- f% Q3 f& |: v2 _& N c% j& ? O global SHARE_Q( D. b0 }. ^0 ^$ a
while not SHARE_Q.empty():
: e2 ]7 I# c$ a' ^9 K7 t url = SHARE_Q.get() #获得任务. M, R$ w5 M! l, h
my_page = get_page(url)/ \1 k, ^ \; k- u
find_data(my_page) #获得当前页面的数据5 p% X7 \! m$ P" n/ O4 l$ f
#write_into_file(temp_data)
. }0 N$ Z" }, y+ M8 M time.sleep(1)0 g; n# i7 u, k2 Y8 J4 P# b. N
SHARE_Q.task_done()2 g: F3 l- N8 o6 z$ K
8 F3 ^- {& q* s) P( L8 s5 `
def get_page(url) :
- ~! C5 ?; T r) ^* n """
& V. h( F( b1 m/ L' \ 根据所给的url爬取网页HTML
" g D# h1 P7 P( p Args:
+ v4 D( H, A. l( y! e& q, O- H url: 表示当前要爬取页面的url
" k( q% ^" S# v; H! Y2 s' C3 ^ Returns:; u5 Z. P- @; l! M, ?2 Q$ n+ O4 i
返回抓取到整个页面的HTML(unicode编码)
5 s- h4 x" s/ g Raises:
5 ^7 f+ {. ]% g6 e# k URLError:url引发的异常7 z; h# R2 s- N# b: M9 D( K/ Q9 L
"""
' A% J3 L: O8 }' K8 O try :
" P5 _- |8 h. K( Y. |! q html = urllib2.urlopen(url).read()
% ^: C& N- K: n" u- H my_page = html.decode("gbk",'ignore')
8 ~5 G0 U9 u: W. K" ^ #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')% b C4 h! a# Y8 E+ Z" E
#my_page = urllib2.urlopen(url).read().decode("utf8")' d9 |1 ]# S9 s; B* b. Z `" O0 P. j' V
except urllib2.URLError, e :, G+ V( A2 L- o, ]
if hasattr(e, "code"):$ M' j7 G* M3 ~. D. ]6 s3 ^% p
print "The server couldn't fulfill the request."
& p$ x; ]: Y& \8 H print "Error code: %s" % e.code9 `8 }3 F# r5 O9 V* V
elif hasattr(e, "reason"):! b- X- E0 T5 \2 |3 a! ~5 K
print "We failed to reach a server. Please check your url and read the Reason"
$ ]3 ~3 P0 N: H( l print "Reason: %s" % e.reason% ^6 f: K( |8 X( Y- w
return my_page
A, I) K6 i7 h, G+ ^ H* l7 j7 ~, c3 ^& Y, Z( \8 i
def find_data(my_page) :
% u9 {; k5 k- }, }. z3 t """, \! q" x2 D8 C" E8 H8 `& R
通过返回的整个网页HTML, 正则匹配名称
4 h5 A6 P2 e/ q' f2 F
) B* i7 q: r) c' g6 i! i0 {3 Q N Args:
* B8 h" b2 L4 A6 c my_page: 传入页面的HTML文本用于正则匹配1 L/ P/ z3 \$ }/ _+ o
"""
; @8 b9 ~. ?8 t1 n/ i global _Num4 a6 }: @ n& e3 F7 r9 I+ U: j
temp_data = []- J7 s7 U# }$ v3 Y8 G& Q; X- g
items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
5 r' X$ w( Q) `5 c for index, item in enumerate(items) :" `. @0 } c+ Z$ g
#print item& M' i1 b, z- Q1 P
#print item.h10 @- i3 K( h4 ?/ D0 }) N! f
#print h.group()
) z* Q! F' E( s% w #temp_data.append(item)
& u3 R/ K! Z7 D) P #print item.find(re.compile("^a"))7 G0 I/ y. _$ D7 ?( l. K
href = item.find(re.compile("^a")): P& _4 M z9 _: o Y. Z2 N' J! V
#soup = BeautifulSoup(item)
% B) a$ P( O5 [ S' ~1 d #公司名称
$ y0 Q# X1 l4 F& k ]; n, R; q' v P if item.a:8 m: w" U: d- ?: z0 W" Q
data = item.a.string.encode("gbk","ignore")
) i0 W5 L. G L4 d) C0 | print data) R4 x9 P0 y# _1 m' w
temp_data.append(data) `) U" z; K! ?- ?2 F+ v% B( c
2 h" F4 l2 L7 Z5 d# K( e" \ goods = item.find_all("div", style="font-size:12px;")
) G! u- M: G# z4 n" @5 @( S: z) a
/ z. t" ~7 J& b% h' i #经营产品与联系方式3 ^/ x+ P0 U2 W. U- y% J
for i in goods:; S% z$ g2 y" \6 G
data = i.get_text().encode("gbk","ignore"). s7 a% \9 a% w1 _8 r, b
temp_data.append(data)
$ i$ \: {+ @2 Q4 f( O- Z1 H print data0 w( Q: ?8 t/ M l. h9 q
#b = item.find_all("b")
; J4 T1 K" l/ O: p #print b5 J ?2 | \$ H5 d/ c$ ^
#链接地址+ j7 E! _) o5 k" m+ E3 X( c2 ^
pat = re.compile(r'href="([^"]*)"')
4 F3 {% T7 H+ ?' t h = pat.search(str(item))3 K u) j3 X% p5 |/ P
if h:( _; C; i; ~3 g9 S/ o
#print h.group(0)
/ ]3 r7 P1 X V' [# X href = h.group(1); S2 Z( q% ]' r2 j* b' t
print href" K+ y( y1 j1 G
temp_data.append(h.group(1))
" R/ @8 P1 G$ s' W( l
% R# Z- x' d" ? _Num += 19 i& w+ {: q/ S+ j" D
#b = item.find_all(text=re.compile("Dormouse"))+ t& s# d0 @, m% S5 Z
#pprint(goods)
7 T# y( Y7 Q8 U4 x/ M. ^! p8 p #print href" B$ N+ ]$ B+ ~4 E) E' I
#pat = re.compile(r'title="([^"]*)"')# t+ \; ^2 }. W2 f- F0 ~* s
#h = pat.search(str(href))
" }1 U- E' l! o4 l1 f7 w/ L #if h:
7 L8 I! N W/ L% C #print h.group(1)
3 \* w: F' g2 B9 t, D! F6 G #temp_data.append(h.group(1))* ?. f9 o8 X" L0 u. |: Q3 t: m
_DATA.append(temp_data)
" {) k; n' Q8 J- [8 A; v( |4 P3 K( Z! {) D& U9 O* H
#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)- B9 b$ `, X; L0 W
#all_url = 'http://www.mzitu.com/all' ##开始的URL地址
2 x1 K; c: @1 j/ q4 s) K#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释! }0 b. z! A" |4 p
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
; c% E5 N& L3 {: ~
# u0 ?: Z* Z9 E( m. @def main() :
% x7 v5 Y. s* |5 H& G8 L% ` global SHARE_Q
8 D2 P) [6 q/ m6 { threads = []
- h6 }$ Z8 ], d, m4 S( k! h1 A start = time.clock()
* `1 G. c4 n0 E) r+ w douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
6 T0 \9 H1 Z" L7 v: M/ ]; F #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务# p O: ^2 X' {" L, M
for index in xrange(20) : D) o4 r T0 x0 T$ n& q* r
SHARE_Q.put(douban_url.format(page = index * 1))0 A6 G7 F8 o5 b$ R% L: a5 A
for i in xrange(_WORKER_THREAD_NUM) :7 I# Z( y% n9 {# g+ u& R
thread = MyThread(worker,i)% |. B& ?. O5 ?! B4 G( b: e
thread.start() #线程开始处理任务
7 }( K( L0 k- T7 ~+ o
/ V( N |4 l$ Y, e9 ? threads.append(thread)
. L' R3 C) Y4 p! A9 C for thread in threads :
+ b- w1 i6 t& x* \4 h m; X% K2 H5 W thread.join()
$ Q5 R: f, ]' P. | SHARE_Q.join()
9 E5 @' c! q5 w! w# w; h6 S i = 0, ]0 L" p% V. s/ p$ g( C
with open("down.txt", "w+") as my_file :3 z* B1 Q! O! ] |
for page in _DATA :5 a# a2 `- s' r5 U" x! Z0 @$ f3 a
i += 16 v; D% W7 H B
for name in page:1 Q; b d0 c! }8 m
my_file.write(name + "\n")
2 N! C5 h3 l% l" t$ ]' r! B* c& A; i2 @# G
print "Spider Successful!!!"/ d; y" k" h# E
end = time.clock()% J0 ^' u& `, f
print u'抓取完成!'" W0 S6 S* o, v0 Z: n: r6 J
print u'总页数:',i4 `; l) E9 n; @3 P
print u'总条数:',_Num
3 g! S0 Y. I) a1 |+ Y+ { print u'一共用时:',end-start,u'秒'
& d5 ^* T- Q& Q9 q7 t6 |
: O( ?- L5 R1 [1 D8 Kif __name__ == '__main__':/ d3 o( p& c# L3 b( x# ~
main()
L9 U( g. Y) w; X2 G8 X* g8 k: r9 p
7 G+ h: s) i1 ]# e8 ~
" @4 C# e# Z" R0 X5 n6 Z- l7 p |
zan
|