QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1171

主题

4

听众

2749

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
( O( k& O* ~6 c8 \# -*- coding:utf-8 -*-. ?1 l4 D! G+ s# p
"""" @3 F8 @" J$ O% B) Z( b
Python爬虫,抓取一卡通相关企业信息
6 x, u) i8 B3 I+ e* wAnthor: yangyongzhen' x9 W% M9 z" c
Version: 0.0.21 @! w+ d$ C6 {2 L% [/ d
Date: 2014-12-14
# h2 M6 w: @0 ^Language: Python2.7.5
& ~" V+ u; y$ DEditor: Sublime Text2
5 e0 m; f" `: m+ R"""& D6 x3 w* M* C: E

% Z1 Y  Q# X9 L/ r5 Timport urllib2, re, string
6 `# Q2 u: s4 ^0 [& Dimport threading, Queue, time
1 j' P' _. Y6 z1 Y; `  M+ vimport sys( b, `9 f% J! j+ s- ]4 Y1 M7 c
import os( B0 g4 g9 l. d1 K
from bs4 import BeautifulSoup
3 w: e- ^  `& d! d$ P, Z9 l#from pprint import pprint
2 S% A# X$ K5 q4 d1 `, ~; Y" H( X: L; o5 q- o% W4 P
reload(sys)
3 R0 {' [5 A9 C+ vsys.setdefaultencoding('utf8')8 F3 Z9 q% L5 B: v4 I: A
_DATA = []
. e1 c) d1 f$ m3 M3 L2 g$ U" x, N4 TFILE_LOCK = threading.Lock()
8 O0 k) O* H- M6 QSHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列! O& E9 L5 n8 w5 }" i) v6 q
_WORKER_THREAD_NUM = 3  #设置线程的个数: X5 i3 j! ]0 y9 G0 X- H. r  J8 J
' u* ^1 L$ [% m% Q
_Num = 0 #总条数2 e6 }% O7 N# z+ ?
class MyThread(threading.Thread) :; `5 @5 R) @# i& {% p# k
  d) U3 a* L9 ~8 J4 Y2 O9 N
    def __init__(self, func,num) :
; o5 f, ~, m( m        super(MyThread, self).__init__()  #调用父类的构造函数' ?- Z- W1 q% p
        self.func = func  #传入线程函数逻辑
; f  E) Q/ f( v0 N$ D        self.thread_num = num  ! Z5 J7 x: F. c3 b' a$ p
    def run(self) :2 p7 K0 E% q# f9 s$ M( R% M
        self.func()
, V% }/ ?& h: F0 O) H        #print u'线程ID:',self.thread_num& d* ~3 q! H. i! l
# `4 t+ t* F) c) A- S$ {; i9 T0 Q* O
def worker() :
1 H  y& v5 ?% l$ c& C6 U    global SHARE_Q
5 G1 m% b& \$ o) ?% L    while not SHARE_Q.empty():
# x. q7 w# k! ~" t- x  W9 r: [3 |  P        url = SHARE_Q.get() #获得任务+ `" Q& h0 F* i4 n) ?2 }
        my_page = get_page(url)  i6 R  O/ x8 \- [
        find_data(my_page)  #获得当前页面的数据
9 Z/ W0 `" ~& T        #write_into_file(temp_data): V% z' L8 Y  y6 b7 ^0 c/ Y* M0 e
        time.sleep(1)3 u4 z+ S/ S0 q8 `6 m
        SHARE_Q.task_done()) w( j; q) |! Z: @; z
7 O7 |0 }! c& Y
def get_page(url) :
5 g3 [/ O2 y$ H' ~# D( a    """* u7 A5 L5 o# P1 t$ u! Q" B
    根据所给的url爬取网页HTML
( F) ^6 C! w: M    Args:
* `# U  |  c* a6 \9 b/ |        url: 表示当前要爬取页面的url! u; T; M! G3 t% q. x; q
    Returns:
$ m& ?  R* _5 r) v        返回抓取到整个页面的HTML(unicode编码)7 m( ?, R4 d3 o; t% l  H) s2 ~
    Raises:% Q/ @. J1 L- \8 w' h
        URLError:url引发的异常
: U  F. r' p  q% P/ \+ M0 W    """' J6 p& o' x; u7 U
    try :
; Z1 A6 I; F7 T  l2 o6 O            html = urllib2.urlopen(url).read()
. G* k* c0 V0 C8 L$ ]1 a            my_page = html.decode("gbk",'ignore')* q2 ^3 a/ c& C. Z
            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')& F# v* n; Z: m. M
        #my_page = urllib2.urlopen(url).read().decode("utf8")+ D- L6 e/ j, Q
    except urllib2.URLError, e :
6 }7 v- J$ O1 g; a( L        if hasattr(e, "code"):
' o* ]$ l% k  P0 ~& X( Y: h* y/ o% h            print "The server couldn't fulfill the request."
. l, |) x4 u5 V, O; k/ f7 E, ^8 y            print "Error code: %s" % e.code. g9 m! q4 m$ p2 A! r- e# j
        elif hasattr(e, "reason"):
+ q2 P6 K) {: i            print "We failed to reach a server. Please check your url and read the Reason"5 C5 g# L/ }8 f+ |
            print "Reason: %s" % e.reason
2 e& C8 p& E  ^+ P) R& D* |. q    return my_page
: m1 c  j1 Y8 Z5 @
- j2 a9 t) y% E( Y# i5 u9 _def find_data(my_page) :
3 I1 d; V- L" f4 t- v    """
6 F5 x8 p& t9 W# M, l" J$ z    通过返回的整个网页HTML, 正则匹配名称$ S1 V1 ^* s5 v$ z7 j5 Y3 {

! d0 z# {; p: S) Y    Args:
# T, U& `0 D$ H% E        my_page: 传入页面的HTML文本用于正则匹配
3 n: u$ f0 p5 f4 l    """
1 |) J# D: V* c5 M4 m. D    global _Num' t/ B9 A. P: d+ e% M; G8 j4 |9 N3 u
    temp_data = []. Y+ R  C$ m4 v4 \- `
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
" [* o' M6 x/ c+ T! N4 |    for index, item in enumerate(items) :( T$ ?& O9 D( V4 ^  h
            #print item- D" Y; F  }& Z; x
            #print item.h1
( h2 T5 f# \$ ?$ {  E9 i        #print h.group()
. b# V9 h4 v0 M  w# G: n            #temp_data.append(item)
* E6 T8 J( F  S- B; f7 l, A0 ~$ l; t, S; g            #print item.find(re.compile("^a"))3 Z( y/ x- E- b& X4 W# t; |2 T
            href = item.find(re.compile("^a"))
- D6 p  R% J2 U            #soup = BeautifulSoup(item)
9 d1 G# J+ V4 {  }+ D' X            #公司名称- \( f( M+ P: @) d
            if item.a:
* F: L( X3 P: @% \* V9 {  |                    data = item.a.string.encode("gbk","ignore"): Q1 {- \9 h$ w2 C1 G
                    print data
1 k* Y. C( I* a3 a% y2 e                    temp_data.append(data)
' [9 T" s0 e. l) |5 |0 K  M# C8 t* W$ C+ }' W
            goods = item.find_all("div", style="font-size:12px;")
% x$ `5 o& I( E            3 k& I, @* t! f* Y8 r
            #经营产品与联系方式, E5 O1 F2 r, r  A+ v" [
            for i in goods:
" S  b2 S9 S1 R- O; g$ J) s                    data = i.get_text().encode("gbk","ignore")8 o! X' s7 }% ^# r
                    temp_data.append(data)
  n' ?8 P7 x. E6 {& [                    print data% o: d+ H% A. K6 n! @- q
            #b = item.find_all("b")
. m+ e2 Q7 d" g6 p+ i& [. I) {6 ?6 G            #print b
1 |  H5 Z3 L3 B            #链接地址
! U( {/ O/ s" @, j# ?            pat = re.compile(r'href="([^"]*)"')+ v" P3 H6 Q& M: z( _7 ~  _
            h = pat.search(str(item))/ `" ^0 A$ a9 T  x% B; j5 u. Y$ I
            if h:
9 n# N" i" M0 a. X3 X# A                    #print h.group(0)
  a( q" G) Y5 C' [7 D- H                    href = h.group(1)
7 b8 o8 m" k( p% W0 i0 J                    print href) [& g* X3 G0 n; P
                    temp_data.append(h.group(1))
$ R8 m! M: q; ?( ^- o
5 I2 K: H/ [6 F& T/ k            _Num += 1
+ w" F; y0 f+ c8 q. p            #b = item.find_all(text=re.compile("Dormouse"))" R  B' F- P9 b& U2 T! M4 b2 q
            #pprint(goods)0 J2 L1 j; ~7 F. ?
            #print href
1 q; n/ t9 {+ v+ U9 ^& D            #pat = re.compile(r'title="([^"]*)"')
  E* n/ S0 U: B; z' ]            #h = pat.search(str(href))1 N: ^+ M+ }! [. d3 l
            #if h:
- x' O- N! ]) \0 T2 m! W( Y4 d' a                    #print h.group(1)
4 p) L. z* v/ R: R) g! A: v: Q                    #temp_data.append(h.group(1))
% p5 |  ]1 ~, p$ [; Z    _DATA.append(temp_data)
: Q1 [2 Z7 X! @5 p+ }1 a2 O1 f! o+ b
! W' T, k& v) _, t3 h7 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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)' ^, s8 t: [" D7 q* w' ~
#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
5 b: }' o2 r9 N6 G#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
, @  y+ V4 k, M; w" K6 b#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)6 |* K9 V' [; k3 Q

% y1 A& @/ c. g# b+ g- v& J, `def main() :& l* Y/ F5 v! }  [, r- J
    global SHARE_Q
4 A6 F( |2 Z% ?! J# I; k! g" o    threads = []8 X; d7 _+ Z# Y: `6 m
    start = time.clock()
( g0 p1 z# }- ~  z# n    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
6 \+ T+ f# m7 Y" H7 W; d9 B    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
2 g) p& `: t, g" H( ~, ]3 }    for index in xrange(20) :   
! h0 V  @& H. d: T; E3 ~. q) p        SHARE_Q.put(douban_url.format(page = index * 1))& _2 l: U: _5 T
    for i in xrange(_WORKER_THREAD_NUM) :$ E+ l8 @( C) d+ W5 }
        thread = MyThread(worker,i)
, k! ^- J* n+ b4 \# h  i        thread.start()  #线程开始处理任务
* |$ P# B; t: a8 B# r) z  G0 {) ^% j; D4 J0 R4 A6 b5 Q
        threads.append(thread)
; o( E9 A) Y# J" d    for thread in threads :
& E; b' m( k" g" e$ Z4 }9 a        thread.join()
5 l: a  ^4 J7 U/ @& e    SHARE_Q.join()- k! W& E+ g' ^2 z6 C
    i = 0
% @2 I' Q! O/ Y! R# @0 L7 E    with open("down.txt", "w+") as my_file :$ V$ b% k9 ]& |- c$ a
        for page in _DATA :- B6 o' s1 {4 P2 t
                i += 1
. b' A9 h; T7 e' r! @6 X4 K7 F                for name in page:
! Y0 T$ t! O9 O$ S8 T                        my_file.write(name + "\n")
* U0 }4 R) U; L. {; V) Y# `( o
/ n% |- }0 ^$ s- m5 z* [/ ^    print "Spider Successful!!!"5 i# w$ ~4 K0 ^6 T
    end = time.clock()6 l% {2 P6 e5 R6 f7 |& }
    print u'抓取完成!'3 h, b0 L" f; A( e* s, A1 p
    print u'总页数:',i4 w6 j3 E5 J1 R/ Y- s8 R& s5 D
    print u'总条数:',_Num
) u7 @/ k! g( C    print u'一共用时:',end-start,u'秒'
: b3 `5 N* I- I* B' a( ^& W; a0 v; V9 _  p! y* \1 V
if __name__ == '__main__':+ j, T! o0 h# ]
    main()0 \: d8 R: A: l; x5 z( l; w

# K( k# c2 c- c/ Q4 H
0 G% E) N6 w, v
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-12 16:56 , Processed in 0.417839 second(s), 50 queries .

回顶部