- 在线时间
- 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
& k/ m, {( g# Z! l* J$ B# -*- coding:utf-8 -*-
6 F, H% v5 l3 R) F* }"""# }+ y- |- U; V$ }
Python爬虫,抓取一卡通相关企业信息
0 b# T, y% G" ]( L9 |9 l* ~( r8 ]Anthor: yangyongzhen$ h2 W5 \# q; j2 z
Version: 0.0.2" N- x4 ?/ A/ C" F3 c
Date: 2014-12-14 ]- r2 j4 j' Y C* e1 P. P
Language: Python2.7.5' a! L: w/ q% u5 g8 x
Editor: Sublime Text2/ a3 ]* o9 ^ q4 E
"""
4 X$ u V$ H3 J+ C" V' V& U
0 R! E5 M- \0 F9 W# ?import urllib2, re, string
R7 h& [& k# o1 r* _+ n8 {import threading, Queue, time7 a" f4 G+ {- W8 a: u& j0 w9 N
import sys# u5 K& j8 z& j6 S. e
import os% \' z6 j; R2 h) u6 m
from bs4 import BeautifulSoup
/ L( B3 N7 T# o9 O1 m6 D6 ]#from pprint import pprint$ v# ^5 v: d2 N- P
Z: w" O3 _+ C( E- J8 s
reload(sys)
6 ~& u) c8 K. D8 V' isys.setdefaultencoding('utf8')
2 h( Y7 u' G( G: k K_DATA = []
3 R/ ^% W- [0 |4 AFILE_LOCK = threading.Lock()* y* q" e: ~5 X7 ~) Q9 u
SHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
5 j2 U5 C$ E9 f_WORKER_THREAD_NUM = 3 #设置线程的个数0 A' k0 H3 H1 Q( k
; C. ?3 t; G6 J_Num = 0 #总条数
7 C" `. |4 M4 m3 l8 Yclass MyThread(threading.Thread) :
" z0 o" ~7 c% G5 e9 |! h9 z( q/ |. Q# {/ h
def __init__(self, func,num) :
+ Q8 |# X0 w& E super(MyThread, self).__init__() #调用父类的构造函数6 [, F% A/ G$ M! W) M
self.func = func #传入线程函数逻辑3 c& b" k4 n2 a5 E
self.thread_num = num
% r) Q% Q+ R% M4 N def run(self) :
5 T7 M% J) U( ~- j3 P# d self.func()
7 V. ]& I: Z5 o' J #print u'线程ID:',self.thread_num' j$ k% a4 Z1 c- ]
; @+ {( n; b7 c' _def worker() :
1 p1 ^/ v {' v2 s* ^, ]0 N' t global SHARE_Q
8 \6 M1 e) T: L M! E while not SHARE_Q.empty():
2 W' m x) i* s& Y7 ` |" | url = SHARE_Q.get() #获得任务
! ^# w/ a. }0 o& k% i my_page = get_page(url)
2 l2 S/ S6 @2 [! ~6 } find_data(my_page) #获得当前页面的数据
^9 e7 u, E# V% y; ~ a #write_into_file(temp_data)
# _& A: R% l) T/ S$ q/ C time.sleep(1)/ H t( v' w5 X* x. S
SHARE_Q.task_done() C) ^3 [# y2 |8 o5 w5 o
( ~9 I9 ?( l I# z! wdef get_page(url) :
& |* _% g9 F! s: U/ h """
8 H6 ]8 A% ^: }# }7 [5 n. r 根据所给的url爬取网页HTML
# R P8 M& ? _ Args: , @8 x4 R% a/ h4 A* [( m" n& Q
url: 表示当前要爬取页面的url4 ?8 |! b+ T( N
Returns:$ w. o% [4 T3 g
返回抓取到整个页面的HTML(unicode编码)
8 N* E0 d# ?7 H Raises:
/ L$ {' u) t A, X: G+ ]# E# S URLError:url引发的异常
6 v% D& L) r6 s9 t' ]/ a """3 F& Z+ P X( A w& Y$ L$ O
try :1 K6 C2 A. e% B" ^" t; w3 i$ |- L
html = urllib2.urlopen(url).read()
/ ?. r4 N' ]& ^ r2 o- l my_page = html.decode("gbk",'ignore'), Q Q& u# T1 q3 v9 |) w
#my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')% C1 o- ^: D% X* D: W) R& {
#my_page = urllib2.urlopen(url).read().decode("utf8")
" V0 ]! |% p9 {* o% g, _ except urllib2.URLError, e :* {$ Z& {# p# d" s' G6 ~
if hasattr(e, "code"):) M' A8 x) l7 u# }) W5 ^
print "The server couldn't fulfill the request."
! c' w" W6 D8 O7 V# m- ?& _: L print "Error code: %s" % e.code
: N# U5 j$ p! c7 V+ B2 x elif hasattr(e, "reason"):
# `, h; J( h7 Y print "We failed to reach a server. Please check your url and read the Reason"5 e! ~0 n5 K9 g2 B0 r
print "Reason: %s" % e.reason$ F, _% c4 I$ A$ T& n4 S
return my_page
: z4 ^5 v# A1 G) Y# ~4 B2 }
" w3 ~% }# H& C% G. I: z5 Ddef find_data(my_page) :
2 N8 _% G4 t) o2 {/ j$ a/ n8 L """
. b2 e9 {# _& Z" Q# \. f 通过返回的整个网页HTML, 正则匹配名称+ S, U) K! @2 ~; X1 h" b# z
2 P y' o7 x1 R
Args:3 m9 i+ r+ s0 q: `4 Q2 U2 e
my_page: 传入页面的HTML文本用于正则匹配
3 u% R! O7 a9 C3 U/ V """
, N8 C: S7 R. q0 X$ h global _Num
1 D- {9 n' }) i( |+ q# Y& |. M temp_data = []
$ W- T2 L6 Q' V2 c; |& x items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
D X) T' k3 ~, j5 Q for index, item in enumerate(items) :. m$ m6 X% ?% o& Y+ ~2 `* y" D! L
#print item7 C0 ~: O f5 N( A7 f! G
#print item.h1' y) L* u1 B# P& p5 T5 ~
#print h.group(); N# w' Q/ v7 c
#temp_data.append(item): ~# O% S. F: V( E" y& W0 |
#print item.find(re.compile("^a"))
$ b- l+ F o$ C% R href = item.find(re.compile("^a"))# U& n/ i0 l( H$ z$ t0 g0 O. p
#soup = BeautifulSoup(item)
0 M& W2 Y" [/ [& r3 _ #公司名称
' b( Y0 g: i1 J if item.a:: E3 u7 O/ D* M& A% m3 K
data = item.a.string.encode("gbk","ignore")
$ W1 _. `0 g0 ?0 x print data, V4 I. B. b( U0 ]
temp_data.append(data)- ]: A- \) O6 i& m8 \% E( k) K
7 _( G' N; S4 f, x7 ~3 B! Q: o goods = item.find_all("div", style="font-size:12px;")6 L5 |+ }0 U0 g
9 Q0 R/ m& _+ D6 U* B% o
#经营产品与联系方式' G4 }) k% k, c* i1 g1 b- V
for i in goods:; R4 _- q& S" w9 X2 z. ]
data = i.get_text().encode("gbk","ignore")
) K/ _" ^# w: l; v- ?1 g. ~ temp_data.append(data)- d! a O- m. N8 X4 J6 i
print data" c9 t; J9 q2 F
#b = item.find_all("b")5 P( ]* c4 J& K% b) S
#print b
! ?* A/ u! u6 @ Q' D #链接地址
3 n1 U) K! n8 S: w) @ pat = re.compile(r'href="([^"]*)"')
2 [8 M3 s' {4 N' t h = pat.search(str(item))
3 {' J1 Y' N, n7 f& u if h:
) I* e' Z2 i6 L. s( ~! D1 |3 r #print h.group(0)$ f+ V# D3 E: D8 b4 `9 h
href = h.group(1)/ D/ v' R* b `3 `: S) F
print href
: J" c- i x) Y( t3 Q c+ H temp_data.append(h.group(1))
! z7 k! f4 E0 Y0 N3 i1 s6 c% k2 B" M/ \' l9 O @
_Num += 1- a7 X: ^- g/ T Q3 y' s9 q: A
#b = item.find_all(text=re.compile("Dormouse"))
5 L4 B1 c, z+ v7 G4 t #pprint(goods)
8 v, X# l, |6 ~. n+ k) e #print href5 G3 [* v: ] @. d) }
#pat = re.compile(r'title="([^"]*)"')2 o: r+ D* I- s3 w
#h = pat.search(str(href))2 j( s, c5 \& Q" g" `2 V
#if h:
; `0 R R7 ^, [- x# u1 p4 \ #print h.group(1)
+ w3 r( p: u. W' a5 v #temp_data.append(h.group(1))
" \1 l$ Q; `2 G" `" i% m( H _DATA.append(temp_data)
. o; P; Z% G0 p' G$ `! O5 s% d+ F4 v0 I
: d! P# `, D" U4 C0 f#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
& P7 J% T8 W t5 V#all_url = 'http://www.mzitu.com/all' ##开始的URL地址
% l3 u2 Y& \. L7 C2 }2 B#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释% ~, Q; q4 l' D N) G8 ]* M
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
+ g x8 V& ?7 ^! `# `3 b
, t! K5 P% I o* `8 i! ^def main() :' e6 S; \% F3 N: \4 R. r2 z
global SHARE_Q% [" n0 E0 A- _: G) Q; S Y! Z0 G
threads = []5 ^ P. b/ ~3 e7 v& t3 b5 t
start = time.clock()1 ?7 E$ a" d3 S \
douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"- Z. O! F7 X; m K
#向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务, _2 ]6 O; p4 q: v3 `6 c. J+ f
for index in xrange(20) : . n2 c( ~6 z; W
SHARE_Q.put(douban_url.format(page = index * 1)): M8 d! ~$ a$ b' y
for i in xrange(_WORKER_THREAD_NUM) :# J/ {4 M. x' i0 r* D2 P& ]
thread = MyThread(worker,i)
- v# H) F# {3 T6 r3 K thread.start() #线程开始处理任务( n N6 ?" d# N" C1 X0 J$ o; P" A
8 f2 A9 w" v7 ?) Z1 h8 A, O
threads.append(thread)
1 f& }, R% q# m; r4 K( [2 ^ for thread in threads :, F" S7 ^2 Y' L ]
thread.join()
* C6 Q- Z+ u# V; F SHARE_Q.join()
$ v7 @2 V7 E" h S0 ?9 e+ g; f i = 0
, Y4 G# k5 B: m" \& ]4 O- Q2 t with open("down.txt", "w+") as my_file :
2 K1 D& G3 I3 a0 z) B5 A1 e+ s! Q for page in _DATA :
$ m, S: o" h& o# U/ \% Q7 ~ i += 1
2 o. W. L1 B0 p, L/ o) h, T1 N) C+ p for name in page:
+ p- P% }2 n) K3 T: n7 I- x' x2 p my_file.write(name + "\n")
: [' K$ y; d0 h: n) A% z5 x' _9 C' t1 E6 T$ N
print "Spider Successful!!!"+ @* _; h# ?) ^: L9 a" P7 z
end = time.clock()8 P+ ?# C3 }9 i' l6 Z
print u'抓取完成!'
0 e) x6 ]; d1 u) z$ H print u'总页数:',i% u% o; E7 R* }& }
print u'总条数:',_Num# L8 o; c+ A! b5 G- g; e
print u'一共用时:',end-start,u'秒'
8 n5 [, d$ b, S1 q* O# D7 l8 ^' y# x8 T% f( i# ` i9 b
if __name__ == '__main__':
4 M+ J: r5 ]+ q4 S0 M/ U main(). N3 O: h! l2 j" M8 ?" @
) `2 ?/ C8 T$ u) t5 V
' P% N' A0 |; |& K |
zan
|