- 在线时间
- 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 python4 T" Z' }- a* U$ n9 E
# -*- coding:utf-8 -*-* @6 b$ ] u4 M$ ~7 e7 ~& k/ r$ _
"""0 ]5 j r+ _4 E3 L. D/ s0 u. b
Python爬虫,抓取一卡通相关企业信息
7 }( I" D6 _& t" y: o1 G. VAnthor: yangyongzhen( z( U) W2 f# X
Version: 0.0.2, I' A( z7 o, M9 S/ U8 h$ L
Date: 2014-12-144 ^' g3 G2 t3 t! k6 A
Language: Python2.7.51 x4 z, b1 G& o9 Y6 z4 @& t4 q1 S
Editor: Sublime Text2( a0 a5 F O9 ]/ Z2 Y( M$ h1 _* [
"""
' H( u% R. }& a6 ^6 T8 k2 V$ ~+ L& i3 R
import urllib2, re, string
7 t4 v& n3 c3 M) y l& q# Z% r# S Qimport threading, Queue, time
7 b9 O7 T, @( |3 { D/ c- Rimport sys
) Z/ L; L0 _9 ^* }) E5 qimport os! q# R+ e W) T9 N b
from bs4 import BeautifulSoup k8 q6 i- t& y4 d4 f
#from pprint import pprint
% x$ k q5 l8 O5 m B
, a$ v; }% W- \; l0 p( hreload(sys)6 U1 _# y8 q' \/ v- d2 p
sys.setdefaultencoding('utf8')
" d0 S, }+ z& N_DATA = []9 ~5 f; k6 N" S. u6 b; O
FILE_LOCK = threading.Lock()
) D8 C$ S( a& d9 xSHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
1 D/ j3 H0 k7 W2 v+ h; n_WORKER_THREAD_NUM = 3 #设置线程的个数
. |& n4 J0 v- B' N4 \3 G) V( u% ?, d2 V T
_Num = 0 #总条数
* b: G, l- K6 z! bclass MyThread(threading.Thread) :
6 r \& H: M) F7 k
" j" t8 w9 u4 p2 ^" E, S def __init__(self, func,num) :
u! l1 Q/ M; \" J$ P6 d& @( `+ _ super(MyThread, self).__init__() #调用父类的构造函数, t2 B: m5 x6 L. g+ y8 P
self.func = func #传入线程函数逻辑
8 e8 w8 O& q, P self.thread_num = num
2 D6 [: M: z+ a' a1 Y3 Q% i. Z+ G0 Z def run(self) :
0 W5 }" c' P7 ~ self.func()* @8 n5 V Y# a' ]6 Z" x1 f5 y, c
#print u'线程ID:',self.thread_num' O. A3 m5 _" t$ H! y
5 o3 k( Z) J1 o o! G8 e- X0 V) x8 qdef worker() :) A* s7 [: R, L+ x2 F. m
global SHARE_Q
4 Y6 O" D; c9 e; [. H4 Z, M; w while not SHARE_Q.empty():: l6 w. u, z# u! L/ U- D
url = SHARE_Q.get() #获得任务
2 N5 }( p( b# t! D4 ` my_page = get_page(url)
0 r0 `. U( q" |5 @3 X& r4 l3 } find_data(my_page) #获得当前页面的数据
- x; w9 K0 u* |; C( {0 D- @: h #write_into_file(temp_data)
: j7 ?% \) q/ S$ ~( {5 S time.sleep(1)
( K6 x! O6 z/ ]3 l! U8 X SHARE_Q.task_done() ]/ M3 ~3 o! M1 U& F3 @
5 ?" p* a- v7 u$ Hdef get_page(url) :* F, i7 F3 Z& Q$ d' e" X6 P" K
"""* W8 m/ m: L. I3 V4 R
根据所给的url爬取网页HTML7 J7 O1 Z9 S" d5 {- u9 W
Args:
E; w: [. g O i- g- K$ | url: 表示当前要爬取页面的url
7 F* O4 ?/ O% _ Returns:0 X! e% @- [: B6 y$ i
返回抓取到整个页面的HTML(unicode编码)
5 ^+ S4 s; x: D- Y& Z$ H8 s Raises:" R+ l) R: s- O4 }: q$ x
URLError:url引发的异常1 N1 {" C6 w+ T
"""" U5 G0 {( k4 |0 w
try :
4 ^1 G. z, l( C2 _ html = urllib2.urlopen(url).read()
! n! K) S# a0 M4 @ my_page = html.decode("gbk",'ignore')
$ ~: E, W; U3 B+ | #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
4 v% r" B5 _5 r* j #my_page = urllib2.urlopen(url).read().decode("utf8"). |3 k. W$ z$ Q4 a9 t3 [5 l
except urllib2.URLError, e :) k1 [/ A+ ^% U2 s
if hasattr(e, "code"):
0 S# E( J8 |2 i+ o: S print "The server couldn't fulfill the request."
. j$ Z- r+ L, z" B. n2 O( t+ k6 e print "Error code: %s" % e.code2 i% b d. ]; M) s
elif hasattr(e, "reason"):
( A9 Q. G; u7 Z' [1 @( b1 B$ B' { print "We failed to reach a server. Please check your url and read the Reason"" T6 R: t1 y8 |5 p+ Y2 n) L3 ?. P
print "Reason: %s" % e.reason; I- {, C( ~2 Y" M6 X
return my_page
7 u, K/ I7 V$ t0 V9 l/ d" Q W7 ~5 C9 H: e* H
def find_data(my_page) :6 a. @2 r3 i5 P n$ e7 h' T
"""
# I8 @' ~7 K' |0 q7 @8 \* D 通过返回的整个网页HTML, 正则匹配名称
2 Q6 W( T4 [3 R- Y* \5 g* \; a; |3 y. t$ p
Args:( _1 r* a' S) j
my_page: 传入页面的HTML文本用于正则匹配
' k7 V6 o, D4 ] """7 {. o& a/ a$ J6 O1 \
global _Num
! n9 F. w" T [# S) Y temp_data = []' X+ y {2 x1 G% l0 R
items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")& A& P3 P2 v! }$ d7 f& `+ n9 H! Y& F
for index, item in enumerate(items) :) X% y: Z5 j4 U8 x% O, O& v
#print item) P u4 ~; K, E8 |3 {
#print item.h1) e5 w* U! L C, `, Q
#print h.group()0 g# W5 V# ?9 Q( m, |
#temp_data.append(item)' W7 F/ a, s3 r! g' j8 H
#print item.find(re.compile("^a")). {8 d4 O I+ n
href = item.find(re.compile("^a"))# S% V7 [" D4 j- z8 @
#soup = BeautifulSoup(item); o& c4 T1 J) K9 e# y
#公司名称7 z4 Z7 l X& v, C
if item.a:! F1 ~! y' c/ ]" |3 A. [, C/ j. m
data = item.a.string.encode("gbk","ignore")
' A. ?+ M2 j: r4 L print data
1 R e' {9 _; z, ? ~6 ?: k) U: H temp_data.append(data)
, R- ]( m# ~: ]) W: [( y9 T1 ]. ^1 E, G9 M
goods = item.find_all("div", style="font-size:12px;")+ t: L2 Z% s( l2 L% ~
0 z8 y- _* S1 f# ? #经营产品与联系方式
' j9 D& k/ ?6 K i for i in goods:/ j" x7 w& J z7 X* x8 v P
data = i.get_text().encode("gbk","ignore")
3 b7 b5 B G' U& D- p temp_data.append(data)' k$ g8 H o, J
print data
9 L2 w# b9 y# G% h5 G5 p #b = item.find_all("b")
6 o+ a* H( y/ g #print b
7 R i4 t" J7 g) N8 H+ j2 } #链接地址1 b7 x# c% u9 c2 t7 O0 ]( E
pat = re.compile(r'href="([^"]*)"'), H" L7 f2 L [ P& m6 ^6 C
h = pat.search(str(item))
% y8 p E) W; H, W2 Q9 n, q" `( q if h:
! o8 P7 `" R5 `5 y% G7 Y9 k #print h.group(0)8 o5 J2 c- ^: H7 p, \; Q* {
href = h.group(1)
! P( m1 |/ t' s9 Z5 p! Y print href4 z% L& {/ T! E( x! K
temp_data.append(h.group(1))
5 O6 H, d% M$ {3 t+ O4 n" N( X
' Y/ w6 V; {# A" m) u: a3 o _Num += 1% T. y1 f+ d9 v& {
#b = item.find_all(text=re.compile("Dormouse"))
: C( c" ^' W5 C, r8 v #pprint(goods)
: q5 M# e1 c1 _) T# m; |1 @6 H #print href6 z7 D, U5 P, j, U0 ~
#pat = re.compile(r'title="([^"]*)"')# ^* ?" k7 I" x7 Z( l
#h = pat.search(str(href))
) K6 `5 L7 S% F$ V4 z #if h:5 A$ [" A5 L. y- t: F
#print h.group(1)
9 @7 P1 o c& z: L #temp_data.append(h.group(1))
2 [; ^/ F+ W- E3 X8 A _DATA.append(temp_data) m$ {5 `2 L. y: x6 K3 _
- m" Z. L, A x: 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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
, u" P6 Z& h" {. R. c2 E7 H4 o#all_url = 'http://www.mzitu.com/all' ##开始的URL地址9 m7 l( e+ M5 V$ Q! _; S* s
#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
9 M9 `/ s6 j+ P& _) o& L( ^#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
. {* J7 H- M* h- H* ~# ^ `+ Z2 U9 u7 G
def main() :; G& N$ r) G6 L7 y$ Q% v! v0 j
global SHARE_Q
2 l* }9 @& Q# Y3 V8 `% O threads = []
; O* l: R1 E: D% _- U* l start = time.clock()# Y/ e6 }( N0 Y: @& q) r1 ]4 F
douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
3 s" F+ |) S% H #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务( n; b, }$ U* {1 \ a Y8 K
for index in xrange(20) : + s& F( W* ^ W) ]( S- W
SHARE_Q.put(douban_url.format(page = index * 1))/ m* a! e, ^9 _- k9 P% f
for i in xrange(_WORKER_THREAD_NUM) :7 l5 M2 c* H6 l0 u$ K% ]
thread = MyThread(worker,i)
% i) T/ V( v) `8 z: V thread.start() #线程开始处理任务
& e9 d7 ]! m. m; x# ^4 [6 u# {' e: s5 g- ^4 v
threads.append(thread)
0 G' f0 D5 \: ^9 [" y: r z& h* F1 n for thread in threads :
, y r: D; _# o7 R R thread.join()3 @: M6 X! p( ]* v, c: O D: n
SHARE_Q.join()6 Z7 @4 z, T( ] ]( o$ a
i = 0+ @! N# b& }4 J% \8 ]
with open("down.txt", "w+") as my_file :
- W& H: j4 u9 M% J% B for page in _DATA :2 @3 Q4 @" x: U% v; g. x
i += 1
1 ]) x1 \$ E, h6 Z5 k1 o |4 h8 o2 j for name in page:9 M4 p0 y1 K- h4 i5 @$ A/ Q
my_file.write(name + "\n")0 z9 j7 a7 L3 p2 O( b! u4 `2 r
o% _# g/ {; c
print "Spider Successful!!!"
# n6 q' I' i3 B1 r end = time.clock()
: q/ Y4 E* B) v- @ print u'抓取完成!'
4 L) h# U( g9 x$ |0 { print u'总页数:',i0 j; k' O+ B+ @8 Z- g
print u'总条数:',_Num5 m4 q9 z; _9 w0 y5 D
print u'一共用时:',end-start,u'秒'
2 B& u i1 N$ y. e4 W. |
6 I: g: |% V2 U( s( dif __name__ == '__main__':7 n& s% [! c {2 [% K0 J
main()# p i% _5 r8 [9 W" o
( \- J" b9 v; l+ S. c1 v6 e# @3 k6 K5 Q. j0 g( a) k7 Q
|
zan
|