- 在线时间
- 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- F9 c& u5 i3 @' C: \
# -*- coding:utf-8 -*-& Z5 Q. t9 F2 J
"""
% Y' X4 ]4 K% Q5 m8 s/ HPython爬虫,抓取一卡通相关企业信息
. R3 U' h6 E. o; H* pAnthor: yangyongzhen
0 R+ o4 G% A f- |Version: 0.0.23 m0 i& T: |3 M9 [
Date: 2014-12-14" d, K3 ^5 R5 n$ @0 c% ]- o
Language: Python2.7.5
8 I5 ?) ^, R" w" j: m6 }$ `5 N7 v9 TEditor: Sublime Text2
# Q' g$ L1 T1 [+ ["""
0 s+ G; S% M0 A7 p
0 U4 v- b0 n7 b P4 [4 K9 `import urllib2, re, string
# _! x' U& C! E4 R5 B* O, S# P/ Kimport threading, Queue, time
+ {4 }! q# Q: I( u( m. }import sys
! z: m$ {$ z) Q" fimport os1 x: `: R$ l# e7 Z& `8 m5 k
from bs4 import BeautifulSoup
* m/ e, {8 f4 e: N+ ~#from pprint import pprint
9 |0 Y4 L* v! e! q8 @
?) V7 G. I4 U, S' treload(sys)
+ o+ G" P1 q8 W: }6 u! e% n6 z' Gsys.setdefaultencoding('utf8')) a* Z2 G5 ~& @
_DATA = []
; @+ l v8 N) A0 Y9 eFILE_LOCK = threading.Lock()
/ j4 \0 B% \0 k- M+ r7 QSHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
- Q3 T# T$ M* X+ N0 k_WORKER_THREAD_NUM = 3 #设置线程的个数! t y% l! v) J: {
, }8 T/ j6 Q- a# K- P8 F' A_Num = 0 #总条数
4 f8 c. w% h0 j9 jclass MyThread(threading.Thread) :
" `% S, H2 S4 {- Q" v0 q1 W9 X
; v; d+ m& D- |$ Y def __init__(self, func,num) :
. u: m4 i. `1 ]" s$ {+ {) c1 o super(MyThread, self).__init__() #调用父类的构造函数
1 h6 N: U. M c* V, c self.func = func #传入线程函数逻辑; B/ E: j9 y2 g7 X! H0 Q; w
self.thread_num = num
1 E+ c3 X& v" t; r* n) d% z/ A# O def run(self) :
! i& Y" N3 L/ d9 t" s/ j9 I" ? self.func()
D; n' \# Q6 i2 }& H0 l# G #print u'线程ID:',self.thread_num
5 z3 y- I# x* a# q
* r9 k1 `7 N$ y6 b1 ^! |def worker() :
/ d2 j+ K/ _! O2 ?4 I3 S) T# F6 N global SHARE_Q6 W' Y7 L) T2 P& ^# n8 j" M7 c
while not SHARE_Q.empty():
2 \: k% L u4 l1 m; Z. g5 H6 d% H url = SHARE_Q.get() #获得任务
5 C% H S) j h% O8 o/ Q my_page = get_page(url)9 m& L8 H2 l2 X# W. G) m! i
find_data(my_page) #获得当前页面的数据6 c$ _$ A) T5 z0 c O5 X/ s# b+ y
#write_into_file(temp_data)
% m! G6 Y" ?2 f& I% T$ x( l; D time.sleep(1) G( {8 k: d { a. ~2 c" N
SHARE_Q.task_done()' X; U* a9 w1 |2 j6 | |/ O2 V/ \
& N5 n# F$ P, V7 {0 ddef get_page(url) : B' x* I3 [+ N$ V
"""
6 d( x! Q+ v" K9 ] 根据所给的url爬取网页HTML
) f/ w9 ?+ F+ E3 x( b0 Q* M Args: 8 ?$ a* @/ t2 i, W; D. P
url: 表示当前要爬取页面的url
1 U1 _( W- V) M( i, u Returns:
* @, E3 e' X: d% Z& b 返回抓取到整个页面的HTML(unicode编码), z1 G+ T- M1 ]1 c; K
Raises:
% q$ f8 } r, a j. ]+ N: V B) ` URLError:url引发的异常; ]* {7 g, P* n& o3 a L4 k/ [
"""7 {% ^2 p% o; }0 U; w1 }5 i
try :
4 y0 u- T& R9 B/ @$ J: @3 N; c html = urllib2.urlopen(url).read()
( H- t) C2 x% u1 Z0 W2 Q my_page = html.decode("gbk",'ignore')
! e; v8 x) J. \* ]8 Y1 j6 X2 ~ #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
3 y& ` ^& I2 G #my_page = urllib2.urlopen(url).read().decode("utf8")
$ b8 E- I8 \) k8 h& |% ? except urllib2.URLError, e :
0 k( Z0 x* D7 `% c if hasattr(e, "code"):0 a4 F" P2 X$ I& s
print "The server couldn't fulfill the request."
, w8 W7 p6 r! v0 k% m8 s" J print "Error code: %s" % e.code
& L0 K# A8 b7 ]1 ]5 f. J1 T+ J elif hasattr(e, "reason"):( D8 x; l5 B! M; x- z
print "We failed to reach a server. Please check your url and read the Reason"! J4 Q; ^% q: D3 i
print "Reason: %s" % e.reason' }# H. T% l* e4 S4 Q
return my_page: H [( I! d' r/ W# [0 j. Y/ b
5 Z$ V& R# }4 O7 s+ u, gdef find_data(my_page) :
/ Y6 M+ p. w ^- |3 a, o6 b """
! b7 z8 U7 D2 z7 Q/ p5 n* t! k: V" R 通过返回的整个网页HTML, 正则匹配名称$ k1 U9 Q" v& a3 f& C$ v
& h) Q; G( ]: e' ~2 w Args:, V" r3 _) Z7 W% s) c% {' Z8 T
my_page: 传入页面的HTML文本用于正则匹配0 m; b& E# o4 D3 y% ]0 H9 c
""": z2 J5 \3 U2 U
global _Num
$ T9 x( m1 b/ P1 `* S temp_data = []
R4 I9 `7 g8 ?& B6 ]8 X+ [$ K items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
$ ~5 i2 @- m% S* K% O% i1 r for index, item in enumerate(items) :
' I9 K& W2 l* j V4 O #print item
; N% O; C, m0 o4 O* w5 {8 k o #print item.h1
+ ^" f! I* n- x; j #print h.group()
0 ~3 M4 W/ ^8 r. W' `: D5 Y #temp_data.append(item). m9 N$ g0 r# `0 \) h. A' q" s
#print item.find(re.compile("^a"))# |% s% `& c6 e; p; C+ F8 }6 |. F: C! d8 M
href = item.find(re.compile("^a"))+ |( G3 U/ _; F4 c6 s
#soup = BeautifulSoup(item)4 Y% T9 {. M4 u7 f7 i/ l) e
#公司名称
' n" l* z8 }2 ?( b if item.a:9 |- [9 E* G% V% S2 K* r0 Z: s
data = item.a.string.encode("gbk","ignore")
* ] S! @3 Q3 d: C: s2 u print data3 [; {: s1 @4 m' N, Q
temp_data.append(data)
* P% |9 p4 z4 P4 |; u5 j) C/ w
7 _ N; }& _. e7 i* t' L goods = item.find_all("div", style="font-size:12px;")7 _4 s+ S* R2 F: X8 p# a
4 K& q0 c0 v: U #经营产品与联系方式
2 V* F+ Y' a) u! a d. o7 ?" ]" g- j. i for i in goods:
/ N3 n# R l: c0 s# p data = i.get_text().encode("gbk","ignore")
& M0 D9 I. \" Z( h temp_data.append(data)
4 k( `4 U, B4 `# F' f print data
0 f, @3 F6 d) Y# \* ^ #b = item.find_all("b")
5 L6 y1 }+ X6 } #print b
* N4 ` f( h- Z) f+ E7 O2 |) [ #链接地址
. m K% q% K9 X% _8 U pat = re.compile(r'href="([^"]*)"')$ X& r% M" a* N8 |4 z6 C9 c0 ~
h = pat.search(str(item))
: {0 q; H# n, J' X4 E3 q if h:
; b* W" j6 D4 @6 I% Y #print h.group(0)3 C7 S( Q8 J+ l7 K7 a5 d9 r
href = h.group(1)- I0 b5 ^' |; L5 b2 d- v* U
print href+ j. n/ ]( W% \+ i B
temp_data.append(h.group(1))
D1 N- P$ q. h, j8 N7 | C0 H* ^) }0 u8 @, y3 J8 L
_Num += 1
2 f9 W6 s0 R, P. r4 v5 @: r #b = item.find_all(text=re.compile("Dormouse"))
; a0 t' y( G7 r. r( g, V- V #pprint(goods)7 m( u1 e$ E. e* `# O/ s+ c% r
#print href
2 P; X* ^! a& X i4 ]# S #pat = re.compile(r'title="([^"]*)"')/ P6 m6 J* k4 Z7 X; h' o
#h = pat.search(str(href))
/ e, u" W) c- `% t' a; ]) w, E4 E2 | #if h:
5 d1 G- X' @6 L' V% j #print h.group(1)4 T/ G- \) O* @
#temp_data.append(h.group(1))5 {# J' g$ q5 l* Z: y8 E
_DATA.append(temp_data), x# l2 ~" k0 P" b- T2 r
& C. u x8 ~1 `9 Q0 Z#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)- c% t5 ^+ z" _9 s
#all_url = 'http://www.mzitu.com/all' ##开始的URL地址1 Z9 V! s2 k7 a) r; g
#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
3 s/ I/ `7 l' C v: O#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text); _! ~+ T* E! E# D" y$ t& A/ W
- Z* e( R% W- fdef main() :
, M* n8 u; G: ~0 H2 M5 @/ k global SHARE_Q
; }( P* {) O* T threads = []& B3 o; f1 n, u* ~
start = time.clock()8 h: ^: t# [3 \; J# h# T
douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
d0 ]% G a, N #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务: k% I0 X( b' F" n! x
for index in xrange(20) :
( ]( c" P& n# L SHARE_Q.put(douban_url.format(page = index * 1))
0 S+ I7 H, k, `- v- b3 F9 t; r& Y for i in xrange(_WORKER_THREAD_NUM) :
: q% o9 _* q7 P9 W; ~- T# \5 x: ~ thread = MyThread(worker,i)7 e; W4 t3 G/ ~: `9 W6 F j5 k6 V
thread.start() #线程开始处理任务' | L8 z( F ~6 g1 {! {; ^
0 s1 t$ u* q) H H1 L' T! [ threads.append(thread)
1 G7 f: _. r. T0 c3 E$ C! E for thread in threads :
/ l; `( d" G( O: I7 l/ x; l thread.join()0 @ J& j% W# }7 b9 E) t7 S% k
SHARE_Q.join()
# l3 z8 k7 T( S, H6 _0 ]' E i = 07 R& P$ D5 o# o* |( \ ^
with open("down.txt", "w+") as my_file :6 a) Y* N. l* c3 h' V ^& K
for page in _DATA :
! W- _1 W, }/ w; N9 o i += 1& D* Z# @" G! P* L0 s
for name in page:/ k3 g. g+ W2 m
my_file.write(name + "\n")
4 T3 z' R; a; O0 l; c. Z& s
3 |+ y I$ d$ K7 s8 h+ C print "Spider Successful!!!"
+ i) Q7 d! a+ C1 a# x end = time.clock()
* }: F: t2 D. C, G8 f" l) x print u'抓取完成!'
# W5 j: }1 ]: p/ ?# \( E print u'总页数:',i4 y4 k* R5 q6 F& J5 ]
print u'总条数:',_Num+ n5 w: c' v M) [
print u'一共用时:',end-start,u'秒'9 }0 E3 H4 z6 _& ]/ k) p
0 P- n9 O3 S& P4 c
if __name__ == '__main__':0 ~ Y* a7 O4 B- A! w* w
main()0 `* y5 v0 o" X6 }, ^& G
, |, w6 A$ M4 J# i. r: k
) g- N. k( q7 {1 K( L. b. R8 n |
zan
|