QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
& k/ m, {( g# Z! l* J$ B# -*- coding:utf-8 -*-
6 F, H% v5 l3 R) F* }"""# }+ y- |- U; V$ }
Python爬虫,抓取一卡通相关企业信息
0 b# T, y% G" ]( L9 |9 l* ~( r8 ]Anthor: yangyongzhen$ h2 W5 \# q; j2 z
Version: 0.0.2" N- x4 ?/ A/ C" F3 c
Date: 2014-12-14  ]- r2 j4 j' Y  C* e1 P. P
Language: Python2.7.5' a! L: w/ q% u5 g8 x
Editor: Sublime Text2/ a3 ]* o9 ^  q4 E
"""
4 X$ u  V$ H3 J+ C" V' V& U
0 R! E5 M- \0 F9 W# ?import urllib2, re, string
  R7 h& [& k# o1 r* _+ n8 {import threading, Queue, time7 a" f4 G+ {- W8 a: u& j0 w9 N
import sys# u5 K& j8 z& j6 S. e
import os% \' z6 j; R2 h) u6 m
from bs4 import BeautifulSoup
/ L( B3 N7 T# o9 O1 m6 D6 ]#from pprint import pprint$ v# ^5 v: d2 N- P
  Z: w" O3 _+ C( E- J8 s
reload(sys)
6 ~& u) c8 K. D8 V' isys.setdefaultencoding('utf8')
2 h( Y7 u' G( G: k  K_DATA = []
3 R/ ^% W- [0 |4 AFILE_LOCK = threading.Lock()* y* q" e: ~5 X7 ~) Q9 u
SHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列
5 j2 U5 C$ E9 f_WORKER_THREAD_NUM = 3  #设置线程的个数0 A' k0 H3 H1 Q( k

; C. ?3 t; G6 J_Num = 0 #总条数
7 C" `. |4 M4 m3 l8 Yclass MyThread(threading.Thread) :
" z0 o" ~7 c% G5 e9 |! h9 z( q/ |. Q# {/ h
    def __init__(self, func,num) :
+ Q8 |# X0 w& E        super(MyThread, self).__init__()  #调用父类的构造函数6 [, F% A/ G$ M! W) M
        self.func = func  #传入线程函数逻辑3 c& b" k4 n2 a5 E
        self.thread_num = num  
% r) Q% Q+ R% M4 N    def run(self) :
5 T7 M% J) U( ~- j3 P# d        self.func()
7 V. ]& I: Z5 o' J        #print u'线程ID:',self.thread_num' j$ k% a4 Z1 c- ]

; @+ {( n; b7 c' _def worker() :
1 p1 ^/ v  {' v2 s* ^, ]0 N' t    global SHARE_Q
8 \6 M1 e) T: L  M! E    while not SHARE_Q.empty():
2 W' m  x) i* s& Y7 `  |" |        url = SHARE_Q.get() #获得任务
! ^# w/ a. }0 o& k% i        my_page = get_page(url)
2 l2 S/ S6 @2 [! ~6 }        find_data(my_page)  #获得当前页面的数据
  ^9 e7 u, E# V% y; ~  a        #write_into_file(temp_data)
# _& A: R% l) T/ S$ q/ C        time.sleep(1)/ H  t( v' w5 X* x. S
        SHARE_Q.task_done()  C) ^3 [# y2 |8 o5 w5 o

( ~9 I9 ?( l  I# z! wdef get_page(url) :
& |* _% g9 F! s: U/ h    """
8 H6 ]8 A% ^: }# }7 [5 n. r    根据所给的url爬取网页HTML
# R  P8 M& ?  _    Args: , @8 x4 R% a/ h4 A* [( m" n& Q
        url: 表示当前要爬取页面的url4 ?8 |! b+ T( N
    Returns:$ w. o% [4 T3 g
        返回抓取到整个页面的HTML(unicode编码)
8 N* E0 d# ?7 H    Raises:
/ L$ {' u) t  A, X: G+ ]# E# S        URLError:url引发的异常
6 v% D& L) r6 s9 t' ]/ a    """3 F& Z+ P  X( A  w& Y$ L$ O
    try :1 K6 C2 A. e% B" ^" t; w3 i$ |- L
            html = urllib2.urlopen(url).read()
/ ?. r4 N' ]& ^  r2 o- l            my_page = html.decode("gbk",'ignore'), Q  Q& u# T1 q3 v9 |) w
            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')% C1 o- ^: D% X* D: W) R& {
        #my_page = urllib2.urlopen(url).read().decode("utf8")
" V0 ]! |% p9 {* o% g, _    except urllib2.URLError, e :* {$ Z& {# p# d" s' G6 ~
        if hasattr(e, "code"):) M' A8 x) l7 u# }) W5 ^
            print "The server couldn't fulfill the request."
! c' w" W6 D8 O7 V# m- ?& _: L            print "Error code: %s" % e.code
: N# U5 j$ p! c7 V+ B2 x        elif hasattr(e, "reason"):
# `, h; J( h7 Y            print "We failed to reach a server. Please check your url and read the Reason"5 e! ~0 n5 K9 g2 B0 r
            print "Reason: %s" % e.reason$ F, _% c4 I$ A$ T& n4 S
    return my_page
: z4 ^5 v# A1 G) Y# ~4 B2 }
" w3 ~% }# H& C% G. I: z5 Ddef find_data(my_page) :
2 N8 _% G4 t) o2 {/ j$ a/ n8 L    """
. b2 e9 {# _& Z" Q# \. f    通过返回的整个网页HTML, 正则匹配名称+ S, U) K! @2 ~; X1 h" b# z
2 P  y' o7 x1 R
    Args:3 m9 i+ r+ s0 q: `4 Q2 U2 e
        my_page: 传入页面的HTML文本用于正则匹配
3 u% R! O7 a9 C3 U/ V    """
, N8 C: S7 R. q0 X$ h    global _Num
1 D- {9 n' }) i( |+ q# Y& |. M    temp_data = []
$ W- T2 L6 Q' V2 c; |& x    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
  D  X) T' k3 ~, j5 Q    for index, item in enumerate(items) :. m$ m6 X% ?% o& Y+ ~2 `* y" D! L
            #print item7 C0 ~: O  f5 N( A7 f! G
            #print item.h1' y) L* u1 B# P& p5 T5 ~
        #print h.group(); N# w' Q/ v7 c
            #temp_data.append(item): ~# O% S. F: V( E" y& W0 |
            #print item.find(re.compile("^a"))
$ b- l+ F  o$ C% R            href = item.find(re.compile("^a"))# U& n/ i0 l( H$ z$ t0 g0 O. p
            #soup = BeautifulSoup(item)
0 M& W2 Y" [/ [& r3 _            #公司名称
' b( Y0 g: i1 J            if item.a:: E3 u7 O/ D* M& A% m3 K
                    data = item.a.string.encode("gbk","ignore")
$ W1 _. `0 g0 ?0 x                    print data, V4 I. B. b( U0 ]
                    temp_data.append(data)- ]: A- \) O6 i& m8 \% E( k) K

7 _( G' N; S4 f, x7 ~3 B! Q: o            goods = item.find_all("div", style="font-size:12px;")6 L5 |+ }0 U0 g
            9 Q0 R/ m& _+ D6 U* B% o
            #经营产品与联系方式' G4 }) k% k, c* i1 g1 b- V
            for i in goods:; R4 _- q& S" w9 X2 z. ]
                    data = i.get_text().encode("gbk","ignore")
) K/ _" ^# w: l; v- ?1 g. ~                    temp_data.append(data)- d! a  O- m. N8 X4 J6 i
                    print data" c9 t; J9 q2 F
            #b = item.find_all("b")5 P( ]* c4 J& K% b) S
            #print b
! ?* A/ u! u6 @  Q' D            #链接地址
3 n1 U) K! n8 S: w) @            pat = re.compile(r'href="([^"]*)"')
2 [8 M3 s' {4 N' t            h = pat.search(str(item))
3 {' J1 Y' N, n7 f& u            if h:
) I* e' Z2 i6 L. s( ~! D1 |3 r                    #print h.group(0)$ f+ V# D3 E: D8 b4 `9 h
                    href = h.group(1)/ D/ v' R* b  `3 `: S) F
                    print href
: J" c- i  x) Y( t3 Q  c+ H                    temp_data.append(h.group(1))
! z7 k! f4 E0 Y0 N3 i1 s6 c% k2 B" M/ \' l9 O  @
            _Num += 1- a7 X: ^- g/ T  Q3 y' s9 q: A
            #b = item.find_all(text=re.compile("Dormouse"))
5 L4 B1 c, z+ v7 G4 t            #pprint(goods)
8 v, X# l, |6 ~. n+ k) e            #print href5 G3 [* v: ]  @. d) }
            #pat = re.compile(r'title="([^"]*)"')2 o: r+ D* I- s3 w
            #h = pat.search(str(href))2 j( s, c5 \& Q" g" `2 V
            #if h:
; `0 R  R7 ^, [- x# u1 p4 \                    #print h.group(1)
+ w3 r( p: u. W' a5 v                    #temp_data.append(h.group(1))
" \1 l$ Q; `2 G" `" i% m( H    _DATA.append(temp_data)
. o; P; Z% G0 p' G$ `! O5 s% d+ F4 v0 I
: d! P# `, D" U4 C0 f#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
& P7 J% T8 W  t5 V#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
% l3 u2 Y& \. L7 C2 }2 B#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释% ~, Q; q4 l' D  N) G8 ]* M
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
+ g  x8 V& ?7 ^! `# `3 b
, t! K5 P% I  o* `8 i! ^def main() :' e6 S; \% F3 N: \4 R. r2 z
    global SHARE_Q% [" n0 E0 A- _: G) Q; S  Y! Z0 G
    threads = []5 ^  P. b/ ~3 e7 v& t3 b5 t
    start = time.clock()1 ?7 E$ a" d3 S  \
    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"- Z. O! F7 X; m  K
    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务, _2 ]6 O; p4 q: v3 `6 c. J+ f
    for index in xrange(20) :   . n2 c( ~6 z; W
        SHARE_Q.put(douban_url.format(page = index * 1)): M8 d! ~$ a$ b' y
    for i in xrange(_WORKER_THREAD_NUM) :# J/ {4 M. x' i0 r* D2 P& ]
        thread = MyThread(worker,i)
- v# H) F# {3 T6 r3 K        thread.start()  #线程开始处理任务( n  N6 ?" d# N" C1 X0 J$ o; P" A
8 f2 A9 w" v7 ?) Z1 h8 A, O
        threads.append(thread)
1 f& }, R% q# m; r4 K( [2 ^    for thread in threads :, F" S7 ^2 Y' L  ]
        thread.join()
* C6 Q- Z+ u# V; F    SHARE_Q.join()
$ v7 @2 V7 E" h  S0 ?9 e+ g; f    i = 0
, Y4 G# k5 B: m" \& ]4 O- Q2 t    with open("down.txt", "w+") as my_file :
2 K1 D& G3 I3 a0 z) B5 A1 e+ s! Q        for page in _DATA :
$ m, S: o" h& o# U/ \% Q7 ~                i += 1
2 o. W. L1 B0 p, L/ o) h, T1 N) C+ p                for name in page:
+ p- P% }2 n) K3 T: n7 I- x' x2 p                        my_file.write(name + "\n")
: [' K$ y; d0 h: n) A% z5 x' _9 C' t1 E6 T$ N
    print "Spider Successful!!!"+ @* _; h# ?) ^: L9 a" P7 z
    end = time.clock()8 P+ ?# C3 }9 i' l6 Z
    print u'抓取完成!'
0 e) x6 ]; d1 u) z$ H    print u'总页数:',i% u% o; E7 R* }& }
    print u'总条数:',_Num# L8 o; c+ A! b5 G- g; e
    print u'一共用时:',end-start,u'秒'
8 n5 [, d$ b, S1 q* O# D7 l8 ^' y# x8 T% f( i# `  i9 b
if __name__ == '__main__':
4 M+ J: r5 ]+ q4 S0 M/ U    main(). N3 O: h! l2 j" M8 ?" @
) `2 ?/ C8 T$ u) t5 V

' P% N' A0 |; |& K
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 07:02 , Processed in 0.407753 second(s), 51 queries .

回顶部