- 在线时间
- 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
1 D% G& _8 w: u5 Q7 i! O* w% s5 ^# -*- coding:utf-8 -*-
5 ^( c7 O+ ~& i& h' U' x4 J"""7 p7 _' u: ^2 D" \1 t' W# a
Python爬虫,抓取一卡通相关企业信息
8 @8 l2 C- h+ r, AAnthor: yangyongzhen5 B7 q5 y: J% M8 Y0 h
Version: 0.0.2
! x! a k- E' i% j& J- d8 Q8 HDate: 2014-12-14( U; t ^: ~9 I
Language: Python2.7.5
6 G' Y/ h; U9 u, _" E UEditor: Sublime Text2- F+ Z& Q0 e5 I. [' H; _
"""5 m6 ~ N* \: d
+ Z0 E+ q% `0 W( f- Oimport urllib2, re, string
& ] ~* n1 D' k" k! o6 _import threading, Queue, time& `5 k' g1 s6 M
import sys g+ u* t5 C# n2 Q" i1 w( B0 x2 T
import os# [! c$ u X$ u s9 _ ~
from bs4 import BeautifulSoup
. q1 E! F) C# l8 s#from pprint import pprint D: P5 X/ l8 ^! N. h; d" ]+ a& }8 |* P
. N! f7 O+ f' O, C$ L }, sreload(sys)3 K5 `7 }( C$ U8 X3 N
sys.setdefaultencoding('utf8')2 q0 j6 {- h( F) w! [- t6 X' K
_DATA = []5 }7 H0 m. h j$ a4 c
FILE_LOCK = threading.Lock()# e" x* Z' x6 {, W5 |8 _
SHARE_Q = Queue.Queue() #构造一个不限制大小的的队列3 ^( }& r1 x7 \ p; s
_WORKER_THREAD_NUM = 3 #设置线程的个数
6 Q/ H8 W: _$ r$ {5 L4 J1 J. \/ F2 y! i6 `; ?
_Num = 0 #总条数2 \/ d% j0 i: ~/ [. Z+ P* }
class MyThread(threading.Thread) :5 u% T0 J3 W( H8 i8 c6 A
. a' J1 v9 ^7 C; }, G5 s
def __init__(self, func,num) :
! O O& z/ A& R H3 j5 A super(MyThread, self).__init__() #调用父类的构造函数# L3 M O. l) g; Y/ B! w
self.func = func #传入线程函数逻辑) x4 x# F' `/ Y/ T0 `
self.thread_num = num
, j* b" w+ j u8 X3 R5 W+ _ def run(self) :' W% v2 E) N- _- @
self.func()
9 Q( G, `# I* z! z- H* ^- ?! t #print u'线程ID:',self.thread_num
8 _9 S1 Z4 c c4 \- L# r& w; ?3 i: C* s/ Y( J
def worker() :
6 L; u: n- x9 B( n+ j- J9 H global SHARE_Q
0 H3 t3 u6 s" A; R2 P- M while not SHARE_Q.empty():
1 f$ U7 N4 g* ]8 B" y: W0 r url = SHARE_Q.get() #获得任务
7 V+ Q- T% {3 m) ] my_page = get_page(url)" y. m. o. ]( x5 o
find_data(my_page) #获得当前页面的数据5 F8 {* i4 I/ R, e' Z6 D
#write_into_file(temp_data)' ~, b( w/ X; Z- |
time.sleep(1)* C0 Y+ r- T, z; ^
SHARE_Q.task_done()2 r% e5 Z. a& l2 D7 L
{4 s( n9 w% b
def get_page(url) :5 p& y2 B. }' j
"""+ K8 z4 l( I d& Y9 Q) W
根据所给的url爬取网页HTML* U$ l* M1 w/ p* Q
Args:
T) g1 F% n/ e$ l2 R url: 表示当前要爬取页面的url, h) O* Z( N. P/ Y b3 G, T& v: M
Returns:! h$ O0 C5 I2 \ z
返回抓取到整个页面的HTML(unicode编码)' k0 _- Q& I9 K9 P7 C" s
Raises:
3 L3 V4 u9 b6 u' q( P& C URLError:url引发的异常
3 g& O1 F" n; x4 O3 z """- u( J; @/ Q: Z" H$ v
try :9 w1 W, @2 X4 b6 x" {. `1 a% e* S
html = urllib2.urlopen(url).read()( o' L# T8 i% x$ J* R" [3 m& W5 S
my_page = html.decode("gbk",'ignore')
/ [4 ?+ i7 H+ j% L8 z- a$ _ #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
. Q+ E0 ?7 R) ?, ?) q h) g #my_page = urllib2.urlopen(url).read().decode("utf8")
7 {. C; t) c( J" o8 U except urllib2.URLError, e :, q% k6 a1 x! G* \+ [* J) ]+ D
if hasattr(e, "code"):1 o0 Q* P; Y# k# }
print "The server couldn't fulfill the request."3 ?: V" T( [% u ~
print "Error code: %s" % e.code
. C4 |1 [: N& w$ J7 y elif hasattr(e, "reason"):& G3 W, H0 u: h
print "We failed to reach a server. Please check your url and read the Reason"
) R" L0 o/ t/ p. f) t$ L print "Reason: %s" % e.reason% U+ N+ U0 o; S" ]
return my_page
F6 ^! I4 t3 e( h2 `* ~# N
* o" A* d w7 j, u5 Xdef find_data(my_page) :- {+ v: Z- X) a0 Z: a2 N% x& W9 l
"""
- |( Q( E: T+ y) @% G5 M/ Q8 Y6 e 通过返回的整个网页HTML, 正则匹配名称9 ]+ d% d. A( g/ v/ q
8 O! f, J% b. G7 [$ m2 I
Args:% `' |( @( N/ t# a8 H, ?9 \
my_page: 传入页面的HTML文本用于正则匹配
* b h5 |" z2 T: e2 g2 V; M% S """0 z. J, p( F* {
global _Num
4 {0 ^5 Q9 E, `- V; v* F, [8 z6 \ temp_data = []
; |; S1 u# c! a: b9 s items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")6 N8 e A# n4 W9 m2 A: u4 ?
for index, item in enumerate(items) :5 ], y9 Y& B: R' g/ G
#print item
0 o6 P: m7 f1 N) H0 U5 d #print item.h1( M/ G3 W- \+ ]& e1 a
#print h.group()
, j+ J* I9 C% U( M9 O% g #temp_data.append(item)
' A% t! W# Z) N0 `: F4 w #print item.find(re.compile("^a"))
' r0 m6 R5 e u( g href = item.find(re.compile("^a"))$ a3 M# ~; w, E) I" k& ?
#soup = BeautifulSoup(item)
$ h, |; I* y- ~5 v! q3 c #公司名称
( ?/ A+ Z6 B* M+ ^! ?3 W if item.a:
* |1 c% i2 k; z8 f0 N: x data = item.a.string.encode("gbk","ignore")
3 V! u6 O3 A; j' o0 q! x+ h print data4 A1 r& y, Q) n# _- X
temp_data.append(data)
6 K; G) m7 Z: B
5 L7 o7 H1 w0 ]3 ?' p goods = item.find_all("div", style="font-size:12px;")2 [ B8 A: z+ K/ r$ D0 M
/ {; A @1 T9 T
#经营产品与联系方式0 L6 m7 _: D1 v3 h0 W7 s
for i in goods:
9 C4 A, ^/ q% w1 \/ | data = i.get_text().encode("gbk","ignore")
0 p* j/ G! R* O9 _ temp_data.append(data)! k7 b8 d* G( M$ h/ z2 q
print data; Q# g) p- L: q6 P& q0 b3 i9 Y
#b = item.find_all("b")* B- p$ G: ^( P) ~0 `9 p
#print b0 e4 L( k& v+ ? a
#链接地址
M+ A) M |% |" K+ k pat = re.compile(r'href="([^"]*)"')
: X2 m( H1 G C: \ h = pat.search(str(item))3 w% C- e8 } |; X( K" a1 W. q
if h:+ [: B4 g& b9 u! e
#print h.group(0)# E9 u& U" ?; c: W$ M; [
href = h.group(1)
1 x8 b3 ~' y) u, i" y print href( Q' `' h, w& v: u" L& G
temp_data.append(h.group(1))
4 F( z+ k* t3 p9 u' z
m$ r* a" L% N% [ _Num += 1
! L. Y, j$ i; j9 N$ Z# z #b = item.find_all(text=re.compile("Dormouse"))
8 h6 F& F/ U5 s" c6 u, B1 m9 T( v( Q #pprint(goods)* q; E- H0 o1 S! v% [2 z
#print href i7 @( A) ^2 m7 ?" f9 N4 K
#pat = re.compile(r'title="([^"]*)"')
* m u& s" ~8 b; j# y- O. Y* Y #h = pat.search(str(href))& y% C( r. _ d6 V
#if h:
. D/ T: m! W' O. J6 B( I8 [6 Y #print h.group(1)- J: p( h' D7 M7 f& Y% h
#temp_data.append(h.group(1))& X' L! I) d% _2 ]3 G" Y x' [
_DATA.append(temp_data)
. |% }. s' ~5 k
X' g- i9 {! G9 q#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 M( I& L2 {( v5 c( U$ Z* Y
#all_url = 'http://www.mzitu.com/all' ##开始的URL地址
! O9 l) o) j; m' G( m, @0 t' M#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释8 F. i. i& B/ R7 w! i
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text), G0 p+ E: [7 O7 d
0 ^( W7 W6 q2 Ydef main() :" @" I. z$ ~) j! w6 s' e3 ~
global SHARE_Q
5 C% i% S( _" b1 p4 A! j threads = []
" m. Y8 ?1 {& S+ e: R start = time.clock()
2 ~- O( c3 G# {* O2 M3 m douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"7 W2 k1 B. o7 j+ D1 }( Z7 i; Z, A
#向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
% u6 x, x; Q2 A0 R) g for index in xrange(20) : ( p, {/ z1 D& Q; h
SHARE_Q.put(douban_url.format(page = index * 1))* D9 M1 r7 l& H& U6 t/ Z
for i in xrange(_WORKER_THREAD_NUM) :7 W& [8 L% @# C9 \, v! g. ~
thread = MyThread(worker,i)! h6 x9 F2 w! X }3 L
thread.start() #线程开始处理任务( o' R/ J# z5 h. j) m8 O9 L
) f7 \5 n1 s: x7 t% u8 m/ g
threads.append(thread)
S, m# G* c/ w. A( [6 T- f; y* B for thread in threads :
! e5 Z- H) @) E) U. e3 ^ thread.join()
1 H- u/ ~& r5 M, X7 z SHARE_Q.join()3 i$ f. W9 v* [# `! j9 H
i = 0
3 \$ }4 j/ ~! T) R( O, F6 d with open("down.txt", "w+") as my_file :% N* P! Q% [! G _" ]
for page in _DATA :
4 B( m' [# c8 E& [2 D( Y5 X i += 1
2 g4 Y- K2 [+ t for name in page:
& I5 `4 q) D( W- G' u my_file.write(name + "\n")4 K* R: X% \7 t" M( U5 _
5 @; B* [9 ^% k print "Spider Successful!!!"/ j- A5 [9 M/ U5 Y) P
end = time.clock()# _$ _( x, j6 R5 J4 a
print u'抓取完成!'
, {1 |8 |# k5 |1 m& f4 J8 ?9 ] print u'总页数:',i' P0 P& }) c `6 N o4 j
print u'总条数:',_Num
& q- ^. K1 j( a1 n6 c print u'一共用时:',end-start,u'秒'' H9 O! r7 V0 I+ M" H
( \" s$ x) }8 Y
if __name__ == '__main__':) I) X# w: q. E- q* Q
main()2 D y! l. Q8 X( a. S( ?
! K0 k/ p2 I l- C2 O. X
0 F4 n) z* M, |. s |
zan
|