QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1171

主题

4

听众

2749

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
0 J. Q: ?5 L$ V# -*- coding:utf-8 -*-. w& G6 K. b9 H" \  g
"""! ?0 V  o& H7 a! M* ^! w
Python爬虫,抓取一卡通相关企业信息
2 V) ~5 D  ?9 `- FAnthor: yangyongzhen
3 O- b$ f! O" q, V* h; UVersion: 0.0.2
; ]. ?8 O2 P/ Z/ Y* h0 jDate: 2014-12-144 R! c) f" n: z  w3 s6 @
Language: Python2.7.56 C( S. w) R3 p7 _9 ?& F5 B7 n, ^  c
Editor: Sublime Text25 H1 i6 G3 Z9 l0 ~9 p
"""& O& |# {1 z! V( F4 M! r
  s# D" n) C: c6 [3 ?
import urllib2, re, string! [) T; D: u3 S' j
import threading, Queue, time
6 W4 v. D- r" G+ T+ Kimport sys3 g& r: \& T' |5 ~5 G
import os
. B& R$ p# W5 m* \) k$ Xfrom bs4 import BeautifulSoup" |9 B) _7 {( t' ]  _
#from pprint import pprint
. P  \+ w: m! h! F% ~- z) }4 d6 x1 }1 K2 W+ Y3 q4 a8 m, u
reload(sys)3 O) ?" Y! _5 C* d2 y/ _# }5 N, V
sys.setdefaultencoding('utf8')
1 \# }$ f  l9 _$ K) Z) M_DATA = []7 l: f" N: F. {& S5 b# F
FILE_LOCK = threading.Lock()
' I9 `1 Z0 ]! |4 ]7 l2 e# ISHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列- ~- f6 J, f. S! s
_WORKER_THREAD_NUM = 3  #设置线程的个数
+ t  ]5 {& g3 F/ y" j4 `* d+ u6 H! I% H6 y( I( L/ N  [
_Num = 0 #总条数
+ P" N/ X# \6 O4 ?* k7 Tclass MyThread(threading.Thread) :
  g6 a! ^7 t  M+ s, a, U4 J6 \- x) u$ N) c6 M" l2 F3 R  ~, u
    def __init__(self, func,num) :
- m, Y* n5 s& O9 A: G" p3 @+ \        super(MyThread, self).__init__()  #调用父类的构造函数
! U' b0 m1 ?. M+ h7 t        self.func = func  #传入线程函数逻辑
& J& `: c9 a2 X2 m        self.thread_num = num  : U7 {# W. h+ B) N
    def run(self) :  ]2 b# n  D5 X8 ~
        self.func()0 t: K; o$ O2 S5 |: j0 y
        #print u'线程ID:',self.thread_num) U( E2 T  x2 q8 X) M/ g+ J6 ]

: g" I- D2 A: }' O! f% ^def worker() :
8 A8 c: n! l3 `    global SHARE_Q7 D; f0 w( n6 O# d! d" y7 R
    while not SHARE_Q.empty():( ~$ l8 N0 p+ d
        url = SHARE_Q.get() #获得任务
% o  a7 N: m! S; i0 R. U        my_page = get_page(url): B# }7 g) I  s/ Y) o- _
        find_data(my_page)  #获得当前页面的数据% K$ W- `: X: t# |
        #write_into_file(temp_data)
: n" Y! P& E6 P8 ]/ O        time.sleep(1)/ L0 t4 B) ^4 M: A* q# ~5 P1 r
        SHARE_Q.task_done()/ ^* \3 E2 e3 |4 j9 K) X

$ z2 ~- h( f; qdef get_page(url) :2 Q: M8 `  T5 w, k) J
    """9 I, d/ D% g' [8 K; E0 i+ ]
    根据所给的url爬取网页HTML
" N/ c5 R2 E1 {$ H9 o    Args:
$ L9 P5 Q3 z7 m6 K/ R- v4 k! _        url: 表示当前要爬取页面的url+ X; p/ Q& p0 Q' o' Y6 D
    Returns:) L- N$ n# {. V* c# n4 s6 ~  H$ z
        返回抓取到整个页面的HTML(unicode编码)5 f: v% _! v# c* O' Q, M
    Raises:
3 X4 w! B* c8 `, P' p        URLError:url引发的异常
, k# w" Q! U1 q    """, k/ n  {. r! b: ?- i
    try :
: s& N/ f0 W% B            html = urllib2.urlopen(url).read()' M- T8 e3 o& U' A" y/ S' K
            my_page = html.decode("gbk",'ignore')5 S4 X' H  B: f1 }
            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
; y. F' n4 o9 i. B0 c* V6 F        #my_page = urllib2.urlopen(url).read().decode("utf8"), o5 V2 E" q3 v: o) i, u
    except urllib2.URLError, e :
2 y$ @5 |7 f% z  W        if hasattr(e, "code"):" e$ E- d; b: Y) C3 c' J& @
            print "The server couldn't fulfill the request."
( U: I6 Z* G& |! e) a2 G; n            print "Error code: %s" % e.code3 k5 ?2 O% o1 y0 F/ \! N
        elif hasattr(e, "reason"):
7 d6 @7 ?* z8 U% X3 q            print "We failed to reach a server. Please check your url and read the Reason"
: o. F+ \" X4 I& k7 f            print "Reason: %s" % e.reason
+ G) T& Y5 ~/ z) ?    return my_page
" q& ^% D2 ~, x6 a! E, k, p! ~8 i2 U/ i
1 H. s. P' g6 B' M# E  J, P. ydef find_data(my_page) :( U" e& ?3 a0 `$ T
    """+ P: N- g' p- L4 V
    通过返回的整个网页HTML, 正则匹配名称
3 N; B! ?+ |1 v8 F. _; u8 E+ [% j- ?: T# _2 A
    Args:
7 k  `! K' B3 k$ G+ s        my_page: 传入页面的HTML文本用于正则匹配. y# i% Z5 x  c& Z9 k% g/ k, M9 I
    """; U) f( g% B, h4 Y+ L
    global _Num3 p4 C- r0 w- u9 p/ f  v( M5 f+ V
    temp_data = []! m0 I, k# O1 r! c5 B5 U
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
7 h, c5 n( c% K# g+ j9 H# [/ `    for index, item in enumerate(items) :
  w5 W. r9 |8 t' z- C" t            #print item8 U% p0 P$ c- k& F6 a9 y6 A+ T/ e
            #print item.h1
$ Y8 X% f5 H5 r' q0 @" D$ Q        #print h.group()
( _+ o4 s$ ^" _            #temp_data.append(item)2 j# ^+ s1 h/ r
            #print item.find(re.compile("^a"))
6 G" K2 o( e( f0 u4 b, U            href = item.find(re.compile("^a"))
- O+ M0 _6 `( N6 N2 X4 E            #soup = BeautifulSoup(item)
. }" k; U( _7 Q. z& _9 ?/ r            #公司名称  x* o* C/ g' U2 f! E1 P" q+ z$ t
            if item.a:
( x( u* y" @4 m1 r& ^                    data = item.a.string.encode("gbk","ignore"); _" ~1 E  G8 Y! o: v1 v
                    print data
5 z! Z3 ]/ n/ V( ]" T6 c                    temp_data.append(data)  n+ d" G/ o1 h7 K

6 V3 W7 z5 n0 L/ f3 l% S            goods = item.find_all("div", style="font-size:12px;")- y4 Q2 k, A3 I  B: ]
            , b) Q3 @; |) V
            #经营产品与联系方式- x. s; r$ @: A" h2 [
            for i in goods:
2 X5 o: K6 n# G& T                    data = i.get_text().encode("gbk","ignore")
. D" V' ?- V& z8 x7 }* m* E                    temp_data.append(data)
& j- @2 A) u+ J                    print data
# U6 U: u2 B0 o) U, ^3 L) u            #b = item.find_all("b")
7 K8 M* T$ g; u, l            #print b
& s0 T/ c* Y5 Q: D6 k+ M/ I* I            #链接地址4 f) u8 e0 Q8 v) R
            pat = re.compile(r'href="([^"]*)"')
& p0 p6 F! X+ F. P  Z            h = pat.search(str(item))
7 N6 W5 q9 C& B% u* n0 E" N9 T            if h:2 ~: R& r8 k7 z$ g. l7 Z
                    #print h.group(0)
3 \; u/ z8 B! ^8 j. ]4 x$ X+ M                    href = h.group(1)- X3 Y/ {. k1 U  H+ _
                    print href9 h+ F. [( [  ~8 P' g
                    temp_data.append(h.group(1))
3 l' ?9 V; W" P( y3 y3 H9 ^4 T/ `$ ~8 P1 R+ {& I5 t# _( O5 D
            _Num += 1
. Q0 q$ G7 t5 X  H% ?            #b = item.find_all(text=re.compile("Dormouse"))
* o" }+ X! X3 K- y4 z" z' `            #pprint(goods): X7 m/ R2 l) d4 A4 s
            #print href  X% Q9 _; n/ X* k0 b. k
            #pat = re.compile(r'title="([^"]*)"')
2 o" l- }/ u0 ]8 J            #h = pat.search(str(href))
* m# l6 ?) U' r' z' A            #if h:; i" E) {! a1 \8 x" f* N
                    #print h.group(1)
) I( l8 P  L% U                    #temp_data.append(h.group(1))/ X' @" ]2 z. [% u" o4 }: I! _
    _DATA.append(temp_data)
" e! c; m* X% M2 [" Q
' j  ~7 X! j* Y4 i0 w3 L: N7 G#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦). z( k+ ~4 y) q7 c! l: v' {% U
#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
  M# [1 i3 `& E- h; u#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
: P1 w8 |7 s0 t6 t1 I#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
# b5 ~/ [$ }! i' D8 ^5 _/ Q- M- y7 j$ w8 N
def main() :' F6 ^9 w' j0 I& W6 C! b
    global SHARE_Q
5 i/ R9 F* W- N: J3 ~" {    threads = []( m/ s1 ?: o  V: M9 r# n
    start = time.clock(), e+ C) X( P+ l( c0 s; e* x
    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
2 }$ ~: T# e$ R) b    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
/ q' o, m$ S/ A8 q  X    for index in xrange(20) :   
) X* J  z' T% W) I; |4 l        SHARE_Q.put(douban_url.format(page = index * 1))
( ?9 a3 Z$ ~! g. S9 O( O    for i in xrange(_WORKER_THREAD_NUM) :; a6 T7 q) |1 p0 \& F7 r
        thread = MyThread(worker,i)
: o$ `; v5 `( o9 a/ A. u9 o* j        thread.start()  #线程开始处理任务
& K0 s& `% n- _
) N4 W; p* ?9 L" P. e( i        threads.append(thread)5 `& G0 M( h7 B& h2 g5 n
    for thread in threads :
( N4 p' H$ E  \' P% `/ t        thread.join()- }+ D6 N7 I- }& ^) A4 C, H
    SHARE_Q.join()7 v3 C8 i& }( @% O
    i = 0
, e% e+ T/ W8 U) G" ]! ~    with open("down.txt", "w+") as my_file :; t$ \( r3 x6 ]8 q# J( q6 Z: J
        for page in _DATA :
4 I, h. u3 l- l& ?- f                i += 1) B# Z4 B/ g2 a0 I. P) S" p
                for name in page:- ~, m0 X7 F" U+ ]) T
                        my_file.write(name + "\n")
" K. ]2 Y& F; y, P
: p6 A5 {7 c8 Q. [4 d8 Y9 _    print "Spider Successful!!!"9 J4 h8 ^+ k# J* W! r
    end = time.clock()
! ~+ m( d. ?* ]# V! v- t* K* I& _    print u'抓取完成!'
$ c/ {  Z2 @. E    print u'总页数:',i
! n2 e; e% t5 C    print u'总条数:',_Num
, ]+ h. d  h. q* h    print u'一共用时:',end-start,u'秒'
8 I% j% l& k8 ~( l! C# E
9 [5 N/ i) y6 sif __name__ == '__main__':
4 A$ t2 O) G: m+ ^% t1 F6 D( ]0 i    main()9 ~8 |6 q* w* [( A+ o5 a; C  M

! |0 p9 v5 z" H" S5 [; G! j' C1 I+ j/ H# h5 I
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, 2025-5-11 18:11 , Processed in 0.586259 second(s), 50 queries .

回顶部