QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1175

主题

4

听众

2877

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python0 D& Z2 W/ R, H$ T) g; b
# -*- coding:utf-8 -*-
  d! g) s0 U9 W"""( B3 U+ G) u; F& b( }: p
Python爬虫,抓取一卡通相关企业信息
* g# L* h3 o7 cAnthor: yangyongzhen
7 F9 r0 `# b/ r  b) U( `; CVersion: 0.0.2
. q# S# k8 G* ?0 D5 D: HDate: 2014-12-14
# h% o8 H' b9 p# j3 _' Y$ [Language: Python2.7.5& ~" ]0 ]! f0 }" F1 k  Y; c+ F8 Q
Editor: Sublime Text2
. z% _( {% S& u8 N"""
2 y  b4 Q" V' [# C
  a' m2 ?- t& h8 I9 }$ |3 l  Yimport urllib2, re, string
. X  e7 e8 D9 j+ s. k; `import threading, Queue, time
4 Y4 a+ X& l* P. j& rimport sys- T0 ]7 z  p& N
import os
% _4 g$ k& y& a9 c1 {3 ~from bs4 import BeautifulSoup* w, ?/ @9 I: l; K9 i( @5 j+ R
#from pprint import pprint
( Z1 F0 p( G/ b  x
( R+ y* s7 q/ mreload(sys)5 |, n* y" V# S; N) p- z, ]
sys.setdefaultencoding('utf8')" P5 A$ W6 A+ X, Y8 l7 F& S: [( t
_DATA = []
, q& |% |# U  VFILE_LOCK = threading.Lock()
' Z2 G9 ~- G7 a' s8 J3 [2 {SHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列
6 }* O! O0 @! r) H8 f  p_WORKER_THREAD_NUM = 3  #设置线程的个数
* j& x5 R4 q" b9 n) G* g
0 X, V) L- g+ \8 [) K" H$ V_Num = 0 #总条数% {( A, g, x; j% W# Q6 G
class MyThread(threading.Thread) :! s4 @/ u3 T7 l

- r7 ~) x& e- Q: m' J" B3 C    def __init__(self, func,num) :. G( ^; w- v! \( |9 J1 N/ {
        super(MyThread, self).__init__()  #调用父类的构造函数! B# y9 ~0 T, H
        self.func = func  #传入线程函数逻辑
6 T/ S1 t( \% g; g/ Y        self.thread_num = num  
4 C- K4 i- N5 d1 Z! B) b    def run(self) :
) z) M8 r* r0 b3 \+ w; t8 r        self.func()$ s1 Z. f# y6 H, H" Y' v8 u
        #print u'线程ID:',self.thread_num
% ]- S* _- |" @2 S$ k8 {" j+ F
6 a! A3 I/ l+ i& J& A" wdef worker() :
- E, L" G/ E8 z3 g1 Y. K    global SHARE_Q- \; x- `, O. ?1 Z. T+ z
    while not SHARE_Q.empty():4 D/ L( {: u1 b7 z% W
        url = SHARE_Q.get() #获得任务
& R% d1 }/ Y9 K' s. C8 ?        my_page = get_page(url)
' i- L5 H$ E( J. u2 g3 ^* ?        find_data(my_page)  #获得当前页面的数据6 A0 a7 K) e. d8 y, R: R
        #write_into_file(temp_data)
2 s$ S, Y* v" P' o- q, `        time.sleep(1)4 C8 d" s; F  \5 D
        SHARE_Q.task_done()/ d: o' B" P8 t) j; `4 F* q

- B1 o; i- M! c" \def get_page(url) :
: M% s: F' ]- l$ m/ D2 }    """$ R. J8 o' W) ?3 h3 x) k4 o! a
    根据所给的url爬取网页HTML
- y$ X- u( K, w. L4 R# ^' C7 n    Args: , Y- q0 t! _$ q% K
        url: 表示当前要爬取页面的url
. A; P" Y( z: _    Returns:
+ ~9 S6 w5 d2 ^$ _: G  A        返回抓取到整个页面的HTML(unicode编码)
' ?, D% K" \' C7 h1 }% h5 D% t    Raises:
( m' R- f( X# F8 j1 j        URLError:url引发的异常9 i1 ?  Q) }9 W' L: T: L, f- P. R
    """& B- M4 `' y  J9 G+ y
    try :* _: n+ @5 P: p  @0 F4 M
            html = urllib2.urlopen(url).read()" W* _) C; }0 g+ ]+ ^, h' T  @( C
            my_page = html.decode("gbk",'ignore')
# v9 X; `- c2 y/ E# ]* j* H            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')1 M0 I( t  h1 ~8 y
        #my_page = urllib2.urlopen(url).read().decode("utf8")
+ s( W2 q& `% E" J* `% R    except urllib2.URLError, e :
& P4 B# C0 W+ o: i7 @: k! V( f        if hasattr(e, "code"):7 H. T  ~" T5 @* c  A% a2 g
            print "The server couldn't fulfill the request."0 i; y  I: g) H3 _  F6 j" y$ k
            print "Error code: %s" % e.code9 M" R; P8 j5 i  R7 {+ F; b2 z
        elif hasattr(e, "reason"):
+ F/ J/ q/ |, h( V            print "We failed to reach a server. Please check your url and read the Reason"
7 y; V( Z5 ]$ J8 |            print "Reason: %s" % e.reason
' \) x: B$ i: j$ O    return my_page8 T' i/ r, C$ u9 c

6 F4 ^& p! G6 H4 G! edef find_data(my_page) :
4 k% P5 A+ F. g. Y: j4 _! a" G. g9 j    """
) L+ J1 F' h% \, M1 ~# P    通过返回的整个网页HTML, 正则匹配名称
0 a2 O5 I# }7 s/ m6 ~/ m+ g5 h  n1 s& w- \8 _
    Args:. l: X) S. e8 I0 J3 b6 C% P- J
        my_page: 传入页面的HTML文本用于正则匹配; I( @% N+ D* t) z8 ]- ~2 m
    """" @) ^: K! K- S
    global _Num4 Y9 E  _5 \) g9 V  L' x. |- T$ F7 H
    temp_data = []; G8 O; H- ~" b! J
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;"): m- v# Q5 l& R# d
    for index, item in enumerate(items) :
& ]% U1 w4 s4 l) Y5 G" ~            #print item' h; L) w" K- ~& n' Q+ D6 h0 F
            #print item.h17 y# x: @1 z9 b& L( x) w! \
        #print h.group()
: t" }0 v" n/ V; x. e            #temp_data.append(item)( z+ l/ r" y, i( p, F- {* r5 L
            #print item.find(re.compile("^a"))0 x+ [, @9 [6 `1 }3 d* J1 E
            href = item.find(re.compile("^a"))6 t8 F, E+ L. n) j) W+ D
            #soup = BeautifulSoup(item)4 n3 t0 z" q* [) S6 G  u4 r+ t
            #公司名称
7 g/ U- A% A' `6 ~            if item.a:
  ?, I9 B, s6 O' J( a' L4 F                    data = item.a.string.encode("gbk","ignore")  L- t/ {+ {  ^& T
                    print data
7 R) b3 b' l, k1 w0 e9 c/ k& @                    temp_data.append(data)# [* D3 d* J) `
: U# x- }+ P( P, d
            goods = item.find_all("div", style="font-size:12px;")
  V4 t3 j6 j/ a  f% g2 V+ V' z            & {. c7 E) C! x
            #经营产品与联系方式
" n8 W& ]* s4 P, j) ?! u8 @' H/ I) t            for i in goods:
( \4 O4 ~; d0 U) Y: G4 b                    data = i.get_text().encode("gbk","ignore"). F# s7 h' D! y' K3 ]2 [  l
                    temp_data.append(data)
6 \/ e$ ?! s( U( E- |/ j+ x                    print data1 x9 z3 [0 f2 R9 |9 `, ]/ S
            #b = item.find_all("b")
; D4 R. z% z& Q9 q8 ^4 ^            #print b' |. d1 q$ w2 H% }6 }% d2 C
            #链接地址
4 @' _9 p$ q% q5 u            pat = re.compile(r'href="([^"]*)"')
- G* C' T$ R) \            h = pat.search(str(item))
- U  T% j4 Q+ j8 Z' y            if h:
2 ?' N  |. J4 b# \( V, G7 [                    #print h.group(0)
) V: ]  x: p9 j                    href = h.group(1)$ B" v6 ~" q0 \
                    print href4 t/ u2 f5 |/ [8 L; ?: a  e+ q
                    temp_data.append(h.group(1))# x6 b7 r0 Z. J$ N, P1 Z5 W' n
5 E. u: [! r) t( T& t4 H
            _Num += 1
6 g7 R7 t3 _1 r( T5 l, i; ]6 @            #b = item.find_all(text=re.compile("Dormouse"))
$ C$ f( B9 ]! K- o3 U            #pprint(goods): I2 ?3 U) q4 I3 ~# b
            #print href
" M) o& X: _# Z7 k            #pat = re.compile(r'title="([^"]*)"'), ?  Y4 Y$ Q, ?6 [& Q% t8 E
            #h = pat.search(str(href))
+ X- {, ?9 h1 k: P$ s( E4 F; ~            #if h:1 {% T" r2 Y& L' ]0 T/ _6 T8 t
                    #print h.group(1)9 U; B: P( `- ?' s
                    #temp_data.append(h.group(1))4 T$ d1 `3 n+ Y% F& E
    _DATA.append(temp_data)
  W7 N* r1 E, B8 E
* l9 F9 ?% J( }, \! ?: @" p- 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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
3 l+ Z+ z6 _, k5 Q, ?#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址4 b/ A& q. V3 D0 U
#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
9 s) G' K( y, P2 E#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)1 c: Y: u1 w( z7 W  [
# |  Y% o- I0 j' j6 B7 A$ z# @8 C
def main() :
) y% U% R4 w" s( T- I    global SHARE_Q( R6 K9 W# {' x; A
    threads = [], s. ]2 a( a$ w9 _" r' _  G  y
    start = time.clock()
6 E9 u: Z/ W* N/ I( C( T# z7 c" k    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"+ Q" M$ p' [7 i2 C! J( y; b( l
    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
0 S9 j* h  C; ?  }1 q    for index in xrange(20) :   
- Y) `- n/ c8 W7 Z8 L6 L* g0 `        SHARE_Q.put(douban_url.format(page = index * 1))0 L# \2 ], T7 u3 k+ v, \
    for i in xrange(_WORKER_THREAD_NUM) :
1 b8 c9 D) `3 M! W% |$ h        thread = MyThread(worker,i); k/ ^# _+ S8 s2 z
        thread.start()  #线程开始处理任务
, o/ ~, p# b6 y1 T1 L0 L# j$ K3 A7 E; e9 W
        threads.append(thread)  k9 [. w9 m9 J0 C& A1 V7 \
    for thread in threads :1 D; k: d$ Q8 h: r! G# N: m
        thread.join()7 e2 B' `( i2 w* b! M
    SHARE_Q.join()$ z! Y% {( Y* M  P( b
    i = 09 S' q4 V* C5 j1 a* B8 h4 }
    with open("down.txt", "w+") as my_file :* D* E/ N- I) B* {3 k
        for page in _DATA :$ Y8 k" m% V, f; _! ?2 R
                i += 1
; [; B6 t/ G3 `2 y                for name in page:4 ^* V( v2 V8 g+ C7 e
                        my_file.write(name + "\n"). O6 ^  d/ f# f. V
  R. p$ x( S& \
    print "Spider Successful!!!"
( I  \* r9 d8 a. q0 X7 |    end = time.clock()
2 b4 D0 b& Y& [) |0 h5 S9 A    print u'抓取完成!'
4 n$ b5 U, Z  a# b* f6 u    print u'总页数:',i
5 F" d$ {) G4 s7 H    print u'总条数:',_Num  V% }. z. h5 Q6 U% ^8 u
    print u'一共用时:',end-start,u'秒'
4 ^- H. p3 g* q7 M
5 d8 S& Q8 A# q% Z+ ]if __name__ == '__main__':! @9 ^0 M7 q' O8 X
    main()
  m0 [. ?. Z2 q, d5 F; r! @( I. D& L1 c' t! O* \

  }/ {! r3 {& ?. P; I# G- {- i  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, 2025-8-23 16:46 , Processed in 0.674298 second(s), 50 queries .

回顶部