- 在线时间
- 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
& o* j. F( m! B& P% f# -*- coding:utf-8 -*-* J) {4 G% u2 n" I
""". l6 v" a- S( u5 O( Z5 ?" e" ~3 [
Python爬虫,抓取一卡通相关企业信息
2 K0 B4 H* h0 c$ u. t- A/ G6 T% XAnthor: yangyongzhen
, z0 I: i6 t1 z6 W4 P$ bVersion: 0.0.22 C8 a5 A9 X, {' P9 N5 B) H/ w2 p
Date: 2014-12-14
% }5 `4 c4 v2 E8 e# B9 |2 u/ zLanguage: Python2.7.5$ j$ t; q' `! W9 ?. V/ w
Editor: Sublime Text2
7 J9 m' ]4 I' n"""
8 |$ v9 J# h7 [: W6 k1 o( N3 j, P, |7 p8 G1 @( M
import urllib2, re, string$ q* A, d9 H, B% |. |
import threading, Queue, time$ X" J7 ?. F! R
import sys
+ Z: |2 d/ V# k% ?3 {8 U" Qimport os) O$ ?/ E# g( j
from bs4 import BeautifulSoup( j5 d5 \. j5 h; r# _9 e
#from pprint import pprint; N. l9 G/ ~! q- ^
, Z( E8 l2 |+ l( K5 U4 e' Y* T# `reload(sys); J3 F8 h0 y; Y( q* [' d; j) j. f
sys.setdefaultencoding('utf8')* C4 F7 W" X& r0 f/ |0 ]1 x% N
_DATA = []( N( l, N+ x4 F7 x6 u3 s
FILE_LOCK = threading.Lock()
! j+ Q- k. P# g& x8 o/ `SHARE_Q = Queue.Queue() #构造一个不限制大小的的队列( I5 S( \+ @( [( M3 H2 T s
_WORKER_THREAD_NUM = 3 #设置线程的个数3 V/ Y) C _0 ~6 N
* W/ w) O A1 d! f& D0 l
_Num = 0 #总条数
7 G1 c: A& x) U) {& Y2 wclass MyThread(threading.Thread) :
/ K5 f6 B( Q j' N4 f# m7 B
* M* A" I; |- X' ]& Q def __init__(self, func,num) :1 L, J8 E2 U( P$ P
super(MyThread, self).__init__() #调用父类的构造函数' D% R: m- A& p
self.func = func #传入线程函数逻辑! L5 C `- p8 k" F1 A' K7 y) ~
self.thread_num = num
0 M0 y5 @7 M0 I8 x def run(self) :
5 G8 `7 n; j8 U- y9 G self.func()/ f h: R8 }3 g0 H- @
#print u'线程ID:',self.thread_num* w( @4 t8 O1 q7 ^# { C. |
0 N( H- x' A# D' c( Jdef worker() :7 L9 f% `5 ^& Q0 j$ M$ m1 E
global SHARE_Q
! m! q" u6 A+ s" N+ \/ s( d. ] while not SHARE_Q.empty():; G- b& }) `$ F k0 x* f
url = SHARE_Q.get() #获得任务
. f& {# b; K$ G* V9 i W my_page = get_page(url)
( F! j' }6 b- y+ k7 u: i find_data(my_page) #获得当前页面的数据
) Q6 ^& }6 O7 n' x# o" t #write_into_file(temp_data)
; L& j3 Z& w# F+ Y U4 _ time.sleep(1)
0 `3 }# T N: N; h1 _ SHARE_Q.task_done()0 j+ h0 ?% z1 @0 O% u# o! Z
s( c* x( M/ S V+ Q. p# @def get_page(url) :
" i* R! \9 O; Y6 E5 T7 j' s, n """
* u7 e7 m1 q# c5 w- V2 b 根据所给的url爬取网页HTML
2 w8 C0 ]. F S6 K. s" l Args: & D4 B3 m1 `9 |0 s3 ~8 Q
url: 表示当前要爬取页面的url5 r( \$ \( `( a5 x- ~9 C
Returns:
- o/ a( Z1 z0 @2 C! D: V 返回抓取到整个页面的HTML(unicode编码); v: g# x! V" E) {
Raises:7 W0 P) E1 R7 D* }9 @( Z
URLError:url引发的异常/ ?0 h+ {) b$ z( n6 U3 ?. \* |
"""
, v/ y0 `" j+ @5 q! V* J try :, w. L1 U5 @6 r. H2 A* n# X
html = urllib2.urlopen(url).read()
1 m }: q/ |; c. H my_page = html.decode("gbk",'ignore'). f9 h" ?% V# C. q0 ]7 `8 N
#my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
9 l: F d2 c9 `" r$ T #my_page = urllib2.urlopen(url).read().decode("utf8")7 G+ i j' ^6 N% I5 Q6 }0 D) t* K
except urllib2.URLError, e :+ Z. B c$ m9 `' }7 s
if hasattr(e, "code"):
6 \0 Y# u9 G; O print "The server couldn't fulfill the request."7 ?% n( c. a5 D) E$ c
print "Error code: %s" % e.code$ o, I* l0 T0 K: j' g
elif hasattr(e, "reason"):5 U( f, y- W; T! f6 C/ j# ]$ |0 V+ M
print "We failed to reach a server. Please check your url and read the Reason"
" h5 a* z# N | print "Reason: %s" % e.reason
# @& S" U& k9 u+ T: Z+ }7 w. e return my_page
3 w, c3 | ?' u0 A( F5 r# L
K& y* R" T% ?, l) V" B4 ]1 @. n1 e b" Ndef find_data(my_page) :
3 v* I1 r, x1 N5 \% E """
w1 ?: p1 g; x1 c. C' @0 V( n 通过返回的整个网页HTML, 正则匹配名称
& m' n9 \7 b2 O: k- h$ W3 M e5 u* c, b& @; f- f5 ?
Args:. Y' U G2 u7 T$ [+ U
my_page: 传入页面的HTML文本用于正则匹配
5 `5 ~) r- e) ~( D1 H """" D3 v' l- C' S6 c* Z- }* ]
global _Num
( q& A* F( E: ^& ]* X+ a7 p temp_data = []$ N: j4 k6 {& M! T
items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;"). l$ r$ h+ h A3 J
for index, item in enumerate(items) :
M4 `7 J# f: n. |4 r: Q. w) q #print item
" V: c7 {4 G9 n #print item.h1
+ ]& ]; ?5 C7 ~( f; ^6 j$ d #print h.group()
* S! o( T% x) j: i3 j #temp_data.append(item)) t* J# x( O7 l* p
#print item.find(re.compile("^a"))
" U- z4 h$ {8 ` href = item.find(re.compile("^a"))/ P1 M5 G/ Q, C0 K0 N
#soup = BeautifulSoup(item)
/ F& Z/ y7 M1 a8 t" F1 K #公司名称
* H4 L& I4 V- ]; Z4 h9 [9 E if item.a:6 c/ T! Q* d* v$ p' R
data = item.a.string.encode("gbk","ignore"): U2 G5 c3 n1 H) s
print data
q; s' X0 I( q% F9 v temp_data.append(data)2 }+ Q/ O% q% S. n7 k
- R0 z3 T1 m: l, C+ M1 m/ Y( \$ I2 J goods = item.find_all("div", style="font-size:12px;")
# K' t( d# h: w- [( }( \; m1 G ! W. o& s" M+ H0 _7 _0 I0 B
#经营产品与联系方式
; e3 S7 D3 ~$ b& E0 X4 R2 y for i in goods:
- b" M$ r" J+ @! k- D data = i.get_text().encode("gbk","ignore")
- m6 ^5 O* m; K+ o. X% [ temp_data.append(data): h3 R) M0 |9 S
print data
/ d0 r# X! l* D) U& l6 ` #b = item.find_all("b")
# L8 z% \" a# b0 T #print b4 B& \" }0 S5 E3 W$ o
#链接地址
& I' |, i+ s& l0 G; ?5 W pat = re.compile(r'href="([^"]*)"')
# j! o+ Y5 l4 q8 {, u h = pat.search(str(item))* R) d( M7 @0 _5 X
if h:: ^5 t8 W9 Z8 h! i8 l# X9 L
#print h.group(0)1 I% j( u0 w* s/ K7 |
href = h.group(1); k4 ?. L2 }: j! x6 i
print href. s' b5 `; W# ]) E: u
temp_data.append(h.group(1))
+ H* Q3 D! s7 S& J$ T
5 ]1 G' D6 b/ @5 ~8 z) H' A a _Num += 1
6 C4 N( Y8 z5 l4 H$ s) K# F #b = item.find_all(text=re.compile("Dormouse"))
* o# v7 G2 m4 n- e4 d #pprint(goods)& m! v# b# `8 Y* ^
#print href
' W' y; D- \7 K #pat = re.compile(r'title="([^"]*)"')' N8 Y, Z4 l* z( D f' y* Y$ J
#h = pat.search(str(href))
# w8 u5 K4 \( k5 z! _! z #if h:' Q4 m% ] m0 i
#print h.group(1)
B4 G h/ K/ h8 ^; I6 ^1 W #temp_data.append(h.group(1))
0 ^4 V5 F" ~- q9 Q) ` _DATA.append(temp_data)! c: V2 d% S1 h0 \& Z
$ `/ y) D% l1 \6 E. v! C#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)( X1 H, f. n. e `4 E: k* g7 G5 Z
#all_url = 'http://www.mzitu.com/all' ##开始的URL地址
. ^% m1 N3 h5 R5 N5 M* \# o- b#start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
8 { {8 g0 M e6 s7 W#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text) P3 ^9 _2 w1 P5 O: k1 s
5 o) ]7 c8 L9 |& {
def main() : C1 L a, ?: ] N6 l# P8 z7 U/ N
global SHARE_Q
% R- a( q! E' e7 w. J+ n! v threads = []: g4 t4 q1 Y$ d8 y# {
start = time.clock(): C9 M# L0 f4 g+ `% r# ?
douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"( M) y4 @% l( [+ |4 Y- Z j% t
#向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
0 C5 ]6 O. p% |# Q' D- x" {! F* R for index in xrange(20) :
( b T" a/ h4 j2 o4 ]: ? SHARE_Q.put(douban_url.format(page = index * 1))6 q+ h7 h; L( T
for i in xrange(_WORKER_THREAD_NUM) :
0 }9 b# \- `$ [. ^- C thread = MyThread(worker,i)
% q2 {! W0 [3 {+ {1 l% z- ]& p thread.start() #线程开始处理任务% D" e6 d) N8 K, M
0 U1 k9 z0 @7 r3 Y8 ~8 v9 a8 ]' k
threads.append(thread)4 z. ]; D% ?! @
for thread in threads :
( r- D9 P% ~" V2 S( ?/ H3 O( h# ? thread.join()
% {1 Z/ Q- Q! c# Y9 M% {5 V SHARE_Q.join()# W) r3 R/ G6 s3 e2 E8 t! i
i = 0
6 O6 L8 d& L; s/ g with open("down.txt", "w+") as my_file :( L+ ^# o8 M8 x+ d% W* s2 u
for page in _DATA :
! K( S' [% {: ]3 E) G2 B0 V3 z i += 1
/ J- G# ~# A% y0 ] R" H8 |" ^ for name in page:6 I* m9 j9 T% Y, s3 q% l
my_file.write(name + "\n")
7 O5 g" r5 k+ j6 L) r9 ?
A+ M- V u: r0 d: J, K; i" R print "Spider Successful!!!"
0 I6 i" N5 ?8 P7 k5 ]" N end = time.clock()
% E* H* \( o8 T7 s print u'抓取完成!'
. @. Z% a# m( I print u'总页数:',i
6 c$ _( V& o. c) p print u'总条数:',_Num
* i- e* i! b, ]2 q6 x, ^+ ~. } print u'一共用时:',end-start,u'秒'% M8 t7 x# B# j# b0 {! u, l
& q* r( d1 I0 Z1 o. T0 oif __name__ == '__main__':
# u) Y z8 c% I+ R J main()
2 t; M9 n& ?6 o2 a7 E- m) T! O" y3 d! ^6 N# k
! R+ ?8 ?7 Y8 f5 ^ |
zan
|