QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2740|回复: 0
打印 上一主题 下一主题

爬虫抓取信息

[复制链接]
字体大小: 正常 放大

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |正序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python! C/ {  U5 d/ R1 s- z% d
# -*- coding:utf-8 -*-
6 D2 l( V- U$ p3 Y; E% H"""$ \. Y' ~& ~, d& j
Python爬虫,抓取一卡通相关企业信息
! ]& J+ o8 r3 EAnthor: yangyongzhen( p9 Q( @. t6 Z3 v
Version: 0.0.2( N. {) Y. v; p. b# Z
Date: 2014-12-14
+ z. m- r9 E. m' P7 |' s; \; L8 uLanguage: Python2.7.5
0 L- ^& c+ u. e# V# rEditor: Sublime Text2' _. w: w* N3 I5 P3 Z1 V# ?% R5 `' Y
"""2 K# H( |; M; Y9 ~& H

( a+ |- s2 s# k6 y9 W% R5 jimport urllib2, re, string
; E) s5 z5 _  g+ f4 N* @7 P% Qimport threading, Queue, time) [! [, R$ Y: m5 Q$ h1 _; J
import sys/ H' _  `5 N/ `( j6 e4 g
import os
& W! k/ @$ ?3 L, V0 Efrom bs4 import BeautifulSoup
4 a. d6 C  t( |# x- f7 Z: A" {  w#from pprint import pprint
/ {) O$ s3 v# F: I  S# N) M0 c8 c# v
reload(sys)
0 U- D8 ]* [  Q/ r. t1 rsys.setdefaultencoding('utf8')% ~1 {' `9 G5 {1 b) b3 @6 u8 F$ z
_DATA = []
) l" a8 q! w/ D* {FILE_LOCK = threading.Lock()
' [  B5 d* e* I6 q8 G# a6 ?$ z1 l  HSHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列
" |7 j  {. R9 p3 C) z_WORKER_THREAD_NUM = 3  #设置线程的个数, V/ G- U4 y) y8 V) ?7 g. I8 a

, {! O# y& y# t_Num = 0 #总条数
- q$ \; ]% t5 t: t' P$ z" Nclass MyThread(threading.Thread) :" G& i6 l& \- \* T3 S( u: s6 S

; s% G) \5 _$ x: c    def __init__(self, func,num) :- e( r9 K4 W- T0 x
        super(MyThread, self).__init__()  #调用父类的构造函数
" L! E9 F) c' L        self.func = func  #传入线程函数逻辑1 {3 l: \1 l# m: |9 c
        self.thread_num = num  " N3 X; ~5 o* U# b% t
    def run(self) :
. Q8 R7 W2 a9 s2 u, X, Q+ j        self.func()5 H- m  L# W- W$ i2 p! e' u) g: D, z
        #print u'线程ID:',self.thread_num
! D( `: V) m9 t5 Y/ ^& @
5 n, l# k) k: v! E( [def worker() :, Z! _* E! E7 }+ r( F& Q
    global SHARE_Q
4 t1 C( Q# M$ i3 ^    while not SHARE_Q.empty():
. Q, T! W& a! r        url = SHARE_Q.get() #获得任务
: m$ y: [+ r: T( k. q        my_page = get_page(url)4 j7 i; f& r: ?- `, n5 b( i) N
        find_data(my_page)  #获得当前页面的数据
& \4 V, |3 ^& W2 L/ i+ k        #write_into_file(temp_data)
! E: S) k. T" i. }+ W& K/ c        time.sleep(1)$ M4 B: g% x4 m9 o
        SHARE_Q.task_done()" r+ p" M! P) ~$ z) G
# t7 T7 A2 s; d6 W/ H/ l
def get_page(url) :
8 I( r- v* [4 y% z% ]2 i4 e- ~) U    """5 `* J/ {: S* K4 Y( X1 e' R% q  \4 |
    根据所给的url爬取网页HTML" P/ k% D- {' S8 o& Q" w* V5 Q+ A
    Args:
* u1 M$ Z. i) N' g" g4 n        url: 表示当前要爬取页面的url0 J- @' a( b# f+ `: _
    Returns:
( K% i9 O4 y! M7 T        返回抓取到整个页面的HTML(unicode编码)
+ n1 ^0 h5 N0 E    Raises:
5 b+ E8 j1 y4 E) U9 F& g, n        URLError:url引发的异常
# k& L8 x& P6 O" P! C+ G    """
( x$ F! Q  U- ?& Q5 I; |    try :
  j4 T1 q" D! c3 o9 y% d            html = urllib2.urlopen(url).read()
2 `# ?3 ]0 S) S3 J" d7 M' N            my_page = html.decode("gbk",'ignore')' ~& O: e, j, O' ~4 ~
            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
6 J! G' q+ P( D. f; Z" l        #my_page = urllib2.urlopen(url).read().decode("utf8")
- g  M2 C2 K3 O: G7 X# b    except urllib2.URLError, e :
# M( M. @: g! T3 u7 d        if hasattr(e, "code"):
1 r5 s. T( m$ L+ |) K2 S& G            print "The server couldn't fulfill the request."" L# m5 P) m, K$ L
            print "Error code: %s" % e.code
) k0 x2 O" i! g, C- p        elif hasattr(e, "reason"):$ j+ b( d7 d+ v% k9 _+ h
            print "We failed to reach a server. Please check your url and read the Reason"
* |6 j; n- l4 X: ?2 i8 x0 T8 _            print "Reason: %s" % e.reason
  E2 U9 K( g3 f, @4 E8 i5 P8 L    return my_page
" }7 j( E! o9 B) \
3 a: @& E6 L9 g  Y1 |% X1 mdef find_data(my_page) :7 k5 X2 x+ Y; N0 ]3 q
    """* V- v, ~8 E* R
    通过返回的整个网页HTML, 正则匹配名称: j9 u$ X: A1 y0 N% s

! T# _5 e; D+ Y. \1 ?, y& B6 n: y7 r4 W    Args:6 c; y! j! O+ t" l* B
        my_page: 传入页面的HTML文本用于正则匹配
( J3 o: B- Z( m2 ~/ {    """
: H7 |7 c, K9 w4 ?6 b4 Y1 s7 h) F    global _Num9 T: v7 |3 u8 {5 Q- B
    temp_data = []
) L5 |$ G  a: ~5 O" V" X6 B4 \3 L* G    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
2 `) e! {6 z# \% i. u    for index, item in enumerate(items) :8 L  b  H4 c* a4 J- o3 t6 c
            #print item' R2 q% ^  G! _# g: d) ?2 ~. r
            #print item.h1( y2 Z3 x2 e- m7 S, Z6 P0 ~
        #print h.group()
) R3 b$ ~* C8 _( v* x            #temp_data.append(item)) m3 G& N+ C7 ~$ o% L" J4 n7 g- v& S! @
            #print item.find(re.compile("^a"))
+ \, E6 B2 H2 L; Q            href = item.find(re.compile("^a"))
( W/ m0 U6 n3 C; G, d- S$ @            #soup = BeautifulSoup(item)
/ H9 O; s9 g4 T" q            #公司名称
, s3 d( o$ X+ d# E            if item.a:
) p- Y/ @  a- f" W+ p, ]* \7 k                    data = item.a.string.encode("gbk","ignore")) V1 v/ O' u4 N- T! ]
                    print data7 }# i9 N! t1 {, ^1 L) }
                    temp_data.append(data)
5 x  w/ |2 ^/ w3 L" q; [% l6 d' H  `1 O- J; j  d6 E; ?% t0 Y
            goods = item.find_all("div", style="font-size:12px;")
. S, T  ?6 w) M           
) r& c7 B7 c5 `) s3 f* U' M            #经营产品与联系方式
9 N! Y' g! }8 B! K1 M6 o6 h            for i in goods:
8 b$ j/ v* i! L) B. @. M/ y. b                    data = i.get_text().encode("gbk","ignore")
4 N( |7 Z5 o% e9 V                    temp_data.append(data)
! B0 d: H* A6 q+ R0 r  T                    print data% g6 Z! ^. X, r0 M" ^! w* ~
            #b = item.find_all("b")- m: \: m3 }7 \4 u. V. Q# ]
            #print b
# e8 n( N# |& x) l7 W* U; c  a            #链接地址
, N* H- p4 y8 S            pat = re.compile(r'href="([^"]*)"')
% ]' x: o% H3 c  Z: R2 K9 L' Y/ r/ A            h = pat.search(str(item))5 R1 w( k+ B. G; Q
            if h:
% ]4 u( a+ D  X4 R1 }( I                    #print h.group(0), F7 `+ ]/ |* D1 j! s+ W
                    href = h.group(1)
% T0 w! r2 w% D8 }                    print href( o1 _, `% C" S4 y5 o2 V5 B0 x
                    temp_data.append(h.group(1))* n8 u2 m/ P+ k  \& u# b' B
5 D- {; B8 D' b0 Z
            _Num += 11 h" T  t3 d: Y, a) r
            #b = item.find_all(text=re.compile("Dormouse"))1 [" l, a- P' o+ T
            #pprint(goods). e$ J% c" m8 R
            #print href6 C$ c4 B9 n0 ~" D8 r. q. d. E4 A
            #pat = re.compile(r'title="([^"]*)"')1 I2 u% e- [1 d! z( r. _4 M
            #h = pat.search(str(href)); ?# N8 r$ C1 ?7 ~
            #if h:& Z/ f: N2 n8 g0 a
                    #print h.group(1)' b2 k: C+ \4 ?, {: t: u; c
                    #temp_data.append(h.group(1))
+ c: d7 u- B3 Y; k& I, r3 g3 D    _DATA.append(temp_data)& }) F/ k% H) c' I3 a' G2 ?" t: T6 T4 g* v

0 @/ g* C! L8 n0 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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
9 ^& ~9 G& B1 i* E0 g0 U. k#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
# ^9 U. B1 @8 l0 G; u6 ~/ _#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释, ~: B$ h2 E( e
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
7 B/ H8 L! w0 d
2 ~6 g; A( ?0 \. u  z1 I' bdef main() :
6 ]+ V4 u' h0 S) p) b$ M    global SHARE_Q
" D4 U' y6 j& \* L0 h  q    threads = []
: K" X% M) T  c2 h6 E    start = time.clock()
+ ]) d1 O& z7 b0 h    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"" e2 i5 h4 q- u1 h
    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
( F. \$ c  ?& x( a    for index in xrange(20) :   
$ Q4 l# i0 o3 v9 X        SHARE_Q.put(douban_url.format(page = index * 1))$ p/ @3 Q; H! \; e- f2 R, }7 z' A9 \
    for i in xrange(_WORKER_THREAD_NUM) :
* ^, o+ P' Q' @- z        thread = MyThread(worker,i)
9 y' k% S8 W& c0 O5 W# \        thread.start()  #线程开始处理任务0 v, e9 I/ s9 o, D: A4 P

' z8 ^9 `; N0 J        threads.append(thread): @1 n# v. O3 w. Y% X* f7 L
    for thread in threads :
- _3 C6 \$ U# M3 X( a2 e        thread.join()
4 ^) ?! [: Q6 G: T# [9 [$ i6 g; N    SHARE_Q.join(). _) W9 o  ]% ^9 H/ V$ L0 w+ s' o
    i = 0
4 ?2 O7 y: g$ ]" U, J- m. {    with open("down.txt", "w+") as my_file :/ B, h5 W. M; I1 }' w# `0 ~1 O
        for page in _DATA :2 v/ F6 \3 |1 \
                i += 1
6 k% _& @3 s% F                for name in page:
* c2 R- ?. E% W; Y+ s  N                        my_file.write(name + "\n")
( @* k( K- h( @" b: ?" u4 f8 h" }; b0 c' h6 J
    print "Spider Successful!!!"
: V: o0 G. Z0 ~( y% F1 M6 t    end = time.clock()
; z2 A6 ~* Y* `8 H+ F" j* Q    print u'抓取完成!'
1 g  h; s6 w) M    print u'总页数:',i
( J9 G/ {; V& Y% L# ~1 R9 q. T    print u'总条数:',_Num; w& W" d" O1 T) [2 T+ g5 Z
    print u'一共用时:',end-start,u'秒'
( I' i- K3 n5 ]- ~' N8 l$ ~/ [$ |/ x7 R
if __name__ == '__main__':
# _$ @0 ~% j; {+ l7 ^% z% \) }    main()8 q4 ~7 o$ Z! n' w6 Y! t) T
: w; y! R; B, G0 y( L9 u

' q- g3 {1 Y( O1 @
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-9-2 15:03 , Processed in 0.593075 second(s), 51 queries .

回顶部