QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python4 T" Z' }- a* U$ n9 E
# -*- coding:utf-8 -*-* @6 b$ ]  u4 M$ ~7 e7 ~& k/ r$ _
"""0 ]5 j  r+ _4 E3 L. D/ s0 u. b
Python爬虫,抓取一卡通相关企业信息
7 }( I" D6 _& t" y: o1 G. VAnthor: yangyongzhen( z( U) W2 f# X
Version: 0.0.2, I' A( z7 o, M9 S/ U8 h$ L
Date: 2014-12-144 ^' g3 G2 t3 t! k6 A
Language: Python2.7.51 x4 z, b1 G& o9 Y6 z4 @& t4 q1 S
Editor: Sublime Text2( a0 a5 F  O9 ]/ Z2 Y( M$ h1 _* [
"""
' H( u% R. }& a6 ^6 T8 k2 V$ ~+ L& i3 R
import urllib2, re, string
7 t4 v& n3 c3 M) y  l& q# Z% r# S  Qimport threading, Queue, time
7 b9 O7 T, @( |3 {  D/ c- Rimport sys
) Z/ L; L0 _9 ^* }) E5 qimport os! q# R+ e  W) T9 N  b
from bs4 import BeautifulSoup  k8 q6 i- t& y4 d4 f
#from pprint import pprint
% x$ k  q5 l8 O5 m  B
, a$ v; }% W- \; l0 p( hreload(sys)6 U1 _# y8 q' \/ v- d2 p
sys.setdefaultencoding('utf8')
" d0 S, }+ z& N_DATA = []9 ~5 f; k6 N" S. u6 b; O
FILE_LOCK = threading.Lock()
) D8 C$ S( a& d9 xSHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列
1 D/ j3 H0 k7 W2 v+ h; n_WORKER_THREAD_NUM = 3  #设置线程的个数
. |& n4 J0 v- B' N4 \3 G) V( u% ?, d2 V  T
_Num = 0 #总条数
* b: G, l- K6 z! bclass MyThread(threading.Thread) :
6 r  \& H: M) F7 k
" j" t8 w9 u4 p2 ^" E, S    def __init__(self, func,num) :
  u! l1 Q/ M; \" J$ P6 d& @( `+ _        super(MyThread, self).__init__()  #调用父类的构造函数, t2 B: m5 x6 L. g+ y8 P
        self.func = func  #传入线程函数逻辑
8 e8 w8 O& q, P        self.thread_num = num  
2 D6 [: M: z+ a' a1 Y3 Q% i. Z+ G0 Z    def run(self) :
0 W5 }" c' P7 ~        self.func()* @8 n5 V  Y# a' ]6 Z" x1 f5 y, c
        #print u'线程ID:',self.thread_num' O. A3 m5 _" t$ H! y

5 o3 k( Z) J1 o  o! G8 e- X0 V) x8 qdef worker() :) A* s7 [: R, L+ x2 F. m
    global SHARE_Q
4 Y6 O" D; c9 e; [. H4 Z, M; w    while not SHARE_Q.empty():: l6 w. u, z# u! L/ U- D
        url = SHARE_Q.get() #获得任务
2 N5 }( p( b# t! D4 `        my_page = get_page(url)
0 r0 `. U( q" |5 @3 X& r4 l3 }        find_data(my_page)  #获得当前页面的数据
- x; w9 K0 u* |; C( {0 D- @: h        #write_into_file(temp_data)
: j7 ?% \) q/ S$ ~( {5 S        time.sleep(1)
( K6 x! O6 z/ ]3 l! U8 X        SHARE_Q.task_done()  ]/ M3 ~3 o! M1 U& F3 @

5 ?" p* a- v7 u$ Hdef get_page(url) :* F, i7 F3 Z& Q$ d' e" X6 P" K
    """* W8 m/ m: L. I3 V4 R
    根据所给的url爬取网页HTML7 J7 O1 Z9 S" d5 {- u9 W
    Args:
  E; w: [. g  O  i- g- K$ |        url: 表示当前要爬取页面的url
7 F* O4 ?/ O% _    Returns:0 X! e% @- [: B6 y$ i
        返回抓取到整个页面的HTML(unicode编码)
5 ^+ S4 s; x: D- Y& Z$ H8 s    Raises:" R+ l) R: s- O4 }: q$ x
        URLError:url引发的异常1 N1 {" C6 w+ T
    """" U5 G0 {( k4 |0 w
    try :
4 ^1 G. z, l( C2 _            html = urllib2.urlopen(url).read()
! n! K) S# a0 M4 @            my_page = html.decode("gbk",'ignore')
$ ~: E, W; U3 B+ |            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
4 v% r" B5 _5 r* j        #my_page = urllib2.urlopen(url).read().decode("utf8"). |3 k. W$ z$ Q4 a9 t3 [5 l
    except urllib2.URLError, e :) k1 [/ A+ ^% U2 s
        if hasattr(e, "code"):
0 S# E( J8 |2 i+ o: S            print "The server couldn't fulfill the request."
. j$ Z- r+ L, z" B. n2 O( t+ k6 e            print "Error code: %s" % e.code2 i% b  d. ]; M) s
        elif hasattr(e, "reason"):
( A9 Q. G; u7 Z' [1 @( b1 B$ B' {            print "We failed to reach a server. Please check your url and read the Reason"" T6 R: t1 y8 |5 p+ Y2 n) L3 ?. P
            print "Reason: %s" % e.reason; I- {, C( ~2 Y" M6 X
    return my_page
7 u, K/ I7 V$ t0 V9 l/ d" Q  W7 ~5 C9 H: e* H
def find_data(my_page) :6 a. @2 r3 i5 P  n$ e7 h' T
    """
# I8 @' ~7 K' |0 q7 @8 \* D    通过返回的整个网页HTML, 正则匹配名称
2 Q6 W( T4 [3 R- Y* \5 g* \; a; |3 y. t$ p
    Args:( _1 r* a' S) j
        my_page: 传入页面的HTML文本用于正则匹配
' k7 V6 o, D4 ]    """7 {. o& a/ a$ J6 O1 \
    global _Num
! n9 F. w" T  [# S) Y    temp_data = []' X+ y  {2 x1 G% l0 R
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")& A& P3 P2 v! }$ d7 f& `+ n9 H! Y& F
    for index, item in enumerate(items) :) X% y: Z5 j4 U8 x% O, O& v
            #print item) P  u4 ~; K, E8 |3 {
            #print item.h1) e5 w* U! L  C, `, Q
        #print h.group()0 g# W5 V# ?9 Q( m, |
            #temp_data.append(item)' W7 F/ a, s3 r! g' j8 H
            #print item.find(re.compile("^a")). {8 d4 O  I+ n
            href = item.find(re.compile("^a"))# S% V7 [" D4 j- z8 @
            #soup = BeautifulSoup(item); o& c4 T1 J) K9 e# y
            #公司名称7 z4 Z7 l  X& v, C
            if item.a:! F1 ~! y' c/ ]" |3 A. [, C/ j. m
                    data = item.a.string.encode("gbk","ignore")
' A. ?+ M2 j: r4 L                    print data
1 R  e' {9 _; z, ?  ~6 ?: k) U: H                    temp_data.append(data)
, R- ]( m# ~: ]) W: [( y9 T1 ]. ^1 E, G9 M
            goods = item.find_all("div", style="font-size:12px;")+ t: L2 Z% s( l2 L% ~
           
0 z8 y- _* S1 f# ?            #经营产品与联系方式
' j9 D& k/ ?6 K  i            for i in goods:/ j" x7 w& J  z7 X* x8 v  P
                    data = i.get_text().encode("gbk","ignore")
3 b7 b5 B  G' U& D- p                    temp_data.append(data)' k$ g8 H  o, J
                    print data
9 L2 w# b9 y# G% h5 G5 p            #b = item.find_all("b")
6 o+ a* H( y/ g            #print b
7 R  i4 t" J7 g) N8 H+ j2 }            #链接地址1 b7 x# c% u9 c2 t7 O0 ]( E
            pat = re.compile(r'href="([^"]*)"'), H" L7 f2 L  [  P& m6 ^6 C
            h = pat.search(str(item))
% y8 p  E) W; H, W2 Q9 n, q" `( q            if h:
! o8 P7 `" R5 `5 y% G7 Y9 k                    #print h.group(0)8 o5 J2 c- ^: H7 p, \; Q* {
                    href = h.group(1)
! P( m1 |/ t' s9 Z5 p! Y                    print href4 z% L& {/ T! E( x! K
                    temp_data.append(h.group(1))
5 O6 H, d% M$ {3 t+ O4 n" N( X
' Y/ w6 V; {# A" m) u: a3 o            _Num += 1% T. y1 f+ d9 v& {
            #b = item.find_all(text=re.compile("Dormouse"))
: C( c" ^' W5 C, r8 v            #pprint(goods)
: q5 M# e1 c1 _) T# m; |1 @6 H            #print href6 z7 D, U5 P, j, U0 ~
            #pat = re.compile(r'title="([^"]*)"')# ^* ?" k7 I" x7 Z( l
            #h = pat.search(str(href))
) K6 `5 L7 S% F$ V4 z            #if h:5 A$ [" A5 L. y- t: F
                    #print h.group(1)
9 @7 P1 o  c& z: L                    #temp_data.append(h.group(1))
2 [; ^/ F+ W- E3 X8 A    _DATA.append(temp_data)  m$ {5 `2 L. y: x6 K3 _

- m" Z. L, A  x: 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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
, u" P6 Z& h" {. R. c2 E7 H4 o#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址9 m7 l( e+ M5 V$ Q! _; S* s
#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
9 M9 `/ s6 j+ P& _) o& L( ^#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
. {* J7 H- M* h- H* ~# ^  `+ Z2 U9 u7 G
def main() :; G& N$ r) G6 L7 y$ Q% v! v0 j
    global SHARE_Q
2 l* }9 @& Q# Y3 V8 `% O    threads = []
; O* l: R1 E: D% _- U* l    start = time.clock()# Y/ e6 }( N0 Y: @& q) r1 ]4 F
    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
3 s" F+ |) S% H    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务( n; b, }$ U* {1 \  a  Y8 K
    for index in xrange(20) :   + s& F( W* ^  W) ]( S- W
        SHARE_Q.put(douban_url.format(page = index * 1))/ m* a! e, ^9 _- k9 P% f
    for i in xrange(_WORKER_THREAD_NUM) :7 l5 M2 c* H6 l0 u$ K% ]
        thread = MyThread(worker,i)
% i) T/ V( v) `8 z: V        thread.start()  #线程开始处理任务
& e9 d7 ]! m. m; x# ^4 [6 u# {' e: s5 g- ^4 v
        threads.append(thread)
0 G' f0 D5 \: ^9 [" y: r  z& h* F1 n    for thread in threads :
, y  r: D; _# o7 R  R        thread.join()3 @: M6 X! p( ]* v, c: O  D: n
    SHARE_Q.join()6 Z7 @4 z, T( ]  ]( o$ a
    i = 0+ @! N# b& }4 J% \8 ]
    with open("down.txt", "w+") as my_file :
- W& H: j4 u9 M% J% B        for page in _DATA :2 @3 Q4 @" x: U% v; g. x
                i += 1
1 ]) x1 \$ E, h6 Z5 k1 o  |4 h8 o2 j                for name in page:9 M4 p0 y1 K- h4 i5 @$ A/ Q
                        my_file.write(name + "\n")0 z9 j7 a7 L3 p2 O( b! u4 `2 r
  o% _# g/ {; c
    print "Spider Successful!!!"
# n6 q' I' i3 B1 r    end = time.clock()
: q/ Y4 E* B) v- @    print u'抓取完成!'
4 L) h# U( g9 x$ |0 {    print u'总页数:',i0 j; k' O+ B+ @8 Z- g
    print u'总条数:',_Num5 m4 q9 z; _9 w0 y5 D
    print u'一共用时:',end-start,u'秒'
2 B& u  i1 N$ y. e4 W. |
6 I: g: |% V2 U( s( dif __name__ == '__main__':7 n& s% [! c  {2 [% K0 J
    main()# p  i% _5 r8 [9 W" o

( \- J" b9 v; l+ S. c1 v6 e# @3 k6 K5 Q. j0 g( a) k7 Q
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-7-18 06:12 , Processed in 0.483035 second(s), 51 queries .

回顶部