QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
. v6 {3 Q: s0 x# P* C# -*- coding:utf-8 -*-4 ~. }/ o7 @; V
"""
& I7 t+ y' i6 z7 H  v, ePython爬虫,抓取一卡通相关企业信息- J3 v! Z# S- m$ k% ^5 N( x: J
Anthor: yangyongzhen
6 [; r4 E3 L7 d3 hVersion: 0.0.2
! W) d' k2 Z) [  E9 a% V) x  DDate: 2014-12-14
; Q# M) G9 L1 v' FLanguage: Python2.7.5
. l7 {; x1 K9 f" p6 WEditor: Sublime Text2
5 D' y8 v- U  s7 U3 ^- P"""
( E/ R8 ?0 m2 L. p' ?
) x+ S) D5 `0 I+ M  himport urllib2, re, string! m  S, q% [- B2 X1 {
import threading, Queue, time
& l( H. V. L# o/ F% Q* }3 S2 Rimport sys
# U2 k0 t6 [+ ]3 U* C" Yimport os
9 c7 X7 T, y" p, J4 F# C' Ufrom bs4 import BeautifulSoup
/ v7 W5 j, W* C. ^/ I# P3 V#from pprint import pprint
% p. c& v2 M- \" x4 W" n9 g5 M# \/ p5 I# I' J4 S) S" n& o5 }( z
reload(sys)
- C) T/ u) C6 |sys.setdefaultencoding('utf8')" d7 l- ?. [2 i- h* p$ l4 t* x% b7 N# C
_DATA = []
* S5 d* ^- v. ]4 c! {, b, _FILE_LOCK = threading.Lock()# k7 i- @$ G' v; ?
SHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列$ Y( w, m8 q5 p4 [  H* J* u
_WORKER_THREAD_NUM = 3  #设置线程的个数
" B; P6 X' C# W- l& y
0 M. c& `; a( n! u. x; G_Num = 0 #总条数
$ `( B' F1 g6 q6 Gclass MyThread(threading.Thread) :$ n' r, J7 ^; H2 w  c
3 c5 t$ U5 E3 E2 k
    def __init__(self, func,num) :+ u- X5 |* A9 f+ x$ w
        super(MyThread, self).__init__()  #调用父类的构造函数" R: S2 H& B2 d/ Y
        self.func = func  #传入线程函数逻辑
7 R5 f$ u  ^" y        self.thread_num = num  $ n0 C& b' Y: W; T( E  d( W% g
    def run(self) :2 w# A( y! ]9 s6 h
        self.func()
  F; k( B$ O- n) E1 Y1 y        #print u'线程ID:',self.thread_num
* j- E1 B% h% {  ~3 P# P' p
/ S( v1 M$ Y9 ^: @% M9 b- Q5 D4 h: Qdef worker() :
# ~& B0 H7 g, u$ Z# q    global SHARE_Q2 K& }. d6 d* u
    while not SHARE_Q.empty():6 N! m! i# G& `" s& E; B, |
        url = SHARE_Q.get() #获得任务. l; s$ h8 U' o( ^
        my_page = get_page(url)4 e# U+ Z3 ?; {. P
        find_data(my_page)  #获得当前页面的数据; J" r; ]/ d. N- Q
        #write_into_file(temp_data)8 i: L. G2 @7 d# G$ }
        time.sleep(1)4 ~5 F6 w: ^0 Q1 b2 T% I
        SHARE_Q.task_done()2 W  D# {- `  z$ R$ }

! A$ H+ j8 k6 y, x" y, Adef get_page(url) :6 v& s; ]8 e8 h1 @0 b# G5 Q+ @
    """
) Q7 C1 p2 S$ R4 l* S/ u% Y    根据所给的url爬取网页HTML# f& l) y: l, S8 q1 _3 e
    Args: 7 L! c+ K' [, m( f& b
        url: 表示当前要爬取页面的url
" ^3 Q5 ~4 a' `. E/ ^* \    Returns:
' G, }8 b9 t  @        返回抓取到整个页面的HTML(unicode编码)% ~9 g: b- ~: w' j: i- S( \; p( k& ?
    Raises:5 J+ m8 I$ W3 g( o$ v
        URLError:url引发的异常; O# V8 c3 f, [% U
    """
7 p; J/ _$ N9 H    try :
2 A8 F4 |/ z$ y; t  G            html = urllib2.urlopen(url).read(): `2 Y0 ^7 e  E! N8 B
            my_page = html.decode("gbk",'ignore')
- T+ }0 E3 h$ y/ P% A- S            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')3 M) T; R/ b+ N$ b& C5 y
        #my_page = urllib2.urlopen(url).read().decode("utf8")
' ?* D$ b" A9 J& A8 j, H    except urllib2.URLError, e :8 [9 O% F* F+ [# M. U
        if hasattr(e, "code"):3 M, y7 m- A! u* d) s5 t5 H
            print "The server couldn't fulfill the request."
8 M* d- _: t# l8 N            print "Error code: %s" % e.code
* t8 G  n9 l2 y5 S4 y" @        elif hasattr(e, "reason"):6 _+ V/ d6 h- r
            print "We failed to reach a server. Please check your url and read the Reason"9 N" x$ N# Q, S
            print "Reason: %s" % e.reason
6 m0 k: x3 T; S. f    return my_page  z* `' m2 R7 D, g. a

9 \* ]( @8 L! C2 [6 x$ I% x! L! cdef find_data(my_page) :
5 A/ M- U1 d# I" T/ d) K    """! b: j5 z8 _1 B9 {: o
    通过返回的整个网页HTML, 正则匹配名称# q6 x; C: D+ n. ~: y" K

' q; c3 m7 d4 t$ X7 e# P7 H7 Z! a    Args:
! k& L8 B8 ~1 d9 M        my_page: 传入页面的HTML文本用于正则匹配
7 F7 ]( x1 u) w5 I& d; r" ~    """
; a. K7 {5 o4 Y- ]5 }/ a    global _Num: m$ A& F, g2 e  M) m9 |
    temp_data = []6 ^1 k  O* \/ x+ V0 s
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")* D; T0 W$ E0 {
    for index, item in enumerate(items) :" {* _) A; r' [7 G9 ?9 ]' k
            #print item
0 f3 i9 M" c. J            #print item.h1- b! m& F: Y  L, v6 ^
        #print h.group()% N3 E; Y# h4 l, ]( I3 @8 N9 H3 V
            #temp_data.append(item)
! i3 m, F5 P, o  c& r" h$ H  }            #print item.find(re.compile("^a"))- k% q: J! E9 b- b
            href = item.find(re.compile("^a"))
# E, w& P9 l& o            #soup = BeautifulSoup(item)
- t  @% ?0 @5 E+ y( [; j            #公司名称) c9 K, B- J  f/ p
            if item.a:) T; G0 V- A( ]5 i0 @+ \  ?. B
                    data = item.a.string.encode("gbk","ignore")
; s9 K# a' Y- w- Q                    print data# k2 J9 }- U: b. z. v( |
                    temp_data.append(data)
+ F# I" E+ G. k) r3 [# O# P& [7 ?" b- c
            goods = item.find_all("div", style="font-size:12px;")# x/ D+ S- X0 b. ], f! J" p
           
0 G" w/ \4 A" M- [8 ]) @            #经营产品与联系方式
# k+ j0 n& w3 y5 c            for i in goods:
# a) q. L, ~( r; J                    data = i.get_text().encode("gbk","ignore")
. o  m0 [8 ~7 _                    temp_data.append(data)
4 O+ p* q" s- G) S8 S/ X1 u- A5 A                    print data& B" S" ~8 O2 D- X$ T# Z' m
            #b = item.find_all("b")8 m* }$ K5 Y+ K; m
            #print b) H1 q8 x6 k) w/ f
            #链接地址/ m) F7 Z7 g$ b% `2 H2 F/ a
            pat = re.compile(r'href="([^"]*)"')5 I. i5 Z6 ]0 |3 D" F# q
            h = pat.search(str(item)), W3 }0 A  r0 \
            if h:
! ?2 z4 d: v. v3 s1 L                    #print h.group(0)' {) B3 E* s- E# r/ {, i& f" r5 v0 }
                    href = h.group(1)- v2 g) ~1 W9 _/ A3 z2 W
                    print href
5 z  t& H4 i+ Y$ N% j# R# m: |( P                    temp_data.append(h.group(1))
: @# {0 v+ Y4 v* U
* W6 {% @5 @; z7 S            _Num += 1- S3 E3 ]1 i6 ?5 @8 X
            #b = item.find_all(text=re.compile("Dormouse"))
) T1 m* ^/ N7 V/ s            #pprint(goods)
- V. I/ H! I6 R' P2 g! F            #print href
8 P; D( W% ^+ d# Q8 ]" n            #pat = re.compile(r'title="([^"]*)"')
& \/ Y) ~. W6 t+ c, s( j            #h = pat.search(str(href))
, v8 A* ]* b0 K            #if h:
, i' z+ j: L# d: O: }2 \  f                    #print h.group(1)
- c9 g; W$ W, M( h                    #temp_data.append(h.group(1))7 c. D5 p/ Q, W3 I* G5 R1 ^
    _DATA.append(temp_data)' l: {# n3 z& G$ y! g: B

5 A; l1 j9 @; n4 V6 w. _#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)/ G/ U% A9 i# \
#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址$ f; L& m# O% ~
#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
1 h/ T0 P* n- x* Z9 O#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
& r' j6 @  I4 p" F9 v
: I6 X9 N0 ^* g$ K( q0 h* |: X. ]def main() :0 E* a2 Z, B4 a1 _
    global SHARE_Q
; C% X0 o% f2 `6 t+ g    threads = []
9 o# w6 ]7 F' u9 a    start = time.clock()
% m* O) @; z% u    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
7 j* K- [) @, g' x$ H- I8 a    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务7 ^. F3 \  `" t: Z
    for index in xrange(20) :   ( }+ v1 _+ j5 L$ j# j0 v
        SHARE_Q.put(douban_url.format(page = index * 1))
  r2 o& H# A7 j) _    for i in xrange(_WORKER_THREAD_NUM) :; z6 o  R  j% o
        thread = MyThread(worker,i)
9 D9 ^2 H2 [: }- I        thread.start()  #线程开始处理任务2 C7 S) K. V* ~! X0 F& ^" |4 o
( H( g: b& z. @. c, @
        threads.append(thread)
) J: L4 m+ Y# E1 N# o7 ?    for thread in threads :
' U: K7 ?2 s  _0 v$ F        thread.join()# `' N# f* N9 k* u+ k8 ^
    SHARE_Q.join()" n: E+ R( o' d) @1 i
    i = 0
0 @6 T) {6 D0 o    with open("down.txt", "w+") as my_file :
" J3 k* I8 m7 X2 t% J$ |        for page in _DATA :
6 M! y6 V7 Z' S                i += 1% O: O/ `+ x4 W3 C) \* X- U! E
                for name in page:, h" [; X& W& W
                        my_file.write(name + "\n")
1 }' r, E9 m0 o* t  F; g; H% v5 u6 o8 c+ V+ d% a( l
    print "Spider Successful!!!": J  k# ~5 `' p/ u
    end = time.clock()
+ x0 [3 Y$ i& J( F* I) w    print u'抓取完成!'
/ ]9 F1 I/ Z* Q* I    print u'总页数:',i. j2 }% ^/ y  g
    print u'总条数:',_Num
! f8 r" q: n, H8 c* F* H4 G    print u'一共用时:',end-start,u'秒'# _& C; V, k$ V( T9 X( R5 W1 b- w

5 D4 d( ]9 A- `/ v( Xif __name__ == '__main__':+ U6 k/ `" d* E; K
    main()) ]0 }; Z# c/ V8 t. K

  b0 \" U3 s6 G  u
! D: {! U8 l5 _' P9 ~. p
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 10:18 , Processed in 0.372943 second(s), 51 queries .

回顶部