QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
7 n, s7 j5 J/ Q: t( @' z+ h# -*- coding:utf-8 -*-. `+ z& i8 w4 B( P! Z
"""( P; z# _; m+ k+ g! X# u" y
Python爬虫,抓取一卡通相关企业信息/ S& M5 ^0 j7 q
Anthor: yangyongzhen$ O4 e& Y4 g* _) j6 H
Version: 0.0.2
  s4 Y" j6 B; c$ P) aDate: 2014-12-14# s, W8 V$ X+ }( J
Language: Python2.7.5/ Q( l, d2 c* Q, D
Editor: Sublime Text2
# W* R% S1 d1 |"""' d3 |- \' ~+ J3 H3 H

: H& o+ }/ V, w  W3 x5 simport urllib2, re, string/ b  @2 h' ^  Q. l
import threading, Queue, time
/ Q" E2 L3 v7 K8 w: w5 P! Cimport sys
5 {7 U+ w2 F6 @) h* }import os  {' R" t/ G/ L4 c; l
from bs4 import BeautifulSoup- Q  d' t2 e1 O* X6 L: a" W
#from pprint import pprint
, u5 w) s) z/ g) V. ?- U9 l! y8 R7 T, `: ^* Z. S2 m
reload(sys)' l% K9 a) B# X+ ~) o4 @% Z
sys.setdefaultencoding('utf8')
( k5 w* c( H- R# d0 m+ q3 c4 u+ L_DATA = []
: a9 K4 r9 J$ `; FFILE_LOCK = threading.Lock()
2 ?( L# `) T1 c' Q; CSHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列: u5 h5 G: ~9 W& }6 [
_WORKER_THREAD_NUM = 3  #设置线程的个数
. v8 k8 B4 s) F; C2 {
9 i$ C( L9 M$ z3 {0 q_Num = 0 #总条数2 y/ G3 r: |" u
class MyThread(threading.Thread) :6 S% O3 F' b) D  y" K, Z
- j, L+ M: U0 R. {$ `# l# d6 L
    def __init__(self, func,num) :
( U2 Y  v- P- D        super(MyThread, self).__init__()  #调用父类的构造函数
4 K" x( O3 z5 _) G) z: W        self.func = func  #传入线程函数逻辑
+ q4 c7 r4 @; Q. M        self.thread_num = num  1 g% z, N' F1 q; R3 J. U* f& i
    def run(self) :8 g9 {" G$ w) B1 J- x
        self.func()
+ r, X, K$ F3 X6 ^        #print u'线程ID:',self.thread_num( R2 v3 d# d4 A( v

1 D0 Q) X+ m$ j3 ?, S" j4 n: @def worker() :: E7 R8 p4 t3 [- ?; m
    global SHARE_Q) S. J2 H. D, D/ b/ n
    while not SHARE_Q.empty():* e( m2 L2 Y1 K5 ?
        url = SHARE_Q.get() #获得任务2 V* [$ w  L3 M, E
        my_page = get_page(url)9 t/ c! O( p  h) S2 v$ O( x
        find_data(my_page)  #获得当前页面的数据/ G. p. g3 G! h7 }, X- y9 X8 @
        #write_into_file(temp_data)
- L& z9 ~& @1 o! J, f- Q3 h) i. s        time.sleep(1)
; E1 @- G2 }2 |) i: G        SHARE_Q.task_done(): S: ^, ?: L& j) _. q- U7 p% f% \
! H' S4 a1 b; W. C- F" a1 s: Y0 F
def get_page(url) :+ o  p* _, C' E" K5 @5 O& e
    """
: q4 R! j2 l' |# }# o( c  \% a    根据所给的url爬取网页HTML
- u. ?  L. s# \    Args:
1 g1 D# g* m0 d$ ^        url: 表示当前要爬取页面的url
& ^- U2 |/ g( g1 ^& X+ M    Returns:, ]  r$ |0 [% l5 m7 i' k
        返回抓取到整个页面的HTML(unicode编码)3 V5 u! D, x- n3 \/ `' ^
    Raises:
  i5 h+ C  {% b) T* a) x4 i& `        URLError:url引发的异常
( S. \8 F% N' b1 c( i0 @# {    """
0 M) Z# s) J6 I+ r6 x    try :, a4 b- W" y  k
            html = urllib2.urlopen(url).read()
  f' ~, t4 w7 K' ?9 E) ~            my_page = html.decode("gbk",'ignore')
% F" k0 U1 _& o8 [% l& w$ A- x' o            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')8 {/ L0 U5 N1 n; w& P  s) U$ T
        #my_page = urllib2.urlopen(url).read().decode("utf8")
6 S) u- [6 J  C0 l4 F& h4 K8 Y    except urllib2.URLError, e :
) d( S  K$ K- f# A        if hasattr(e, "code"):- i- N4 n0 I7 k
            print "The server couldn't fulfill the request."
1 W4 f/ A; ^/ Y+ U2 M2 o            print "Error code: %s" % e.code7 @0 _  [4 t$ y7 Y: y- C
        elif hasattr(e, "reason"):, j0 g% ~- \) q/ m
            print "We failed to reach a server. Please check your url and read the Reason", C+ i$ \2 l1 g/ ?% F% M! v
            print "Reason: %s" % e.reason
! i- Q4 {/ ^0 \% A5 h    return my_page. x0 c" f* m2 x" T
9 `( `& Q, f' W# n( L9 k
def find_data(my_page) :7 G5 s3 F0 `$ h; C& _
    """
: p# m8 [3 C! ?. h8 E8 ]& w5 A. I    通过返回的整个网页HTML, 正则匹配名称5 M; `# @4 H7 f. A* D9 M5 b
3 N' V3 y  Z) E5 i3 N
    Args:
& M; ^* h) J5 U- i        my_page: 传入页面的HTML文本用于正则匹配7 t# J) J0 w7 I* y. w5 i# d
    """+ ]$ f) X# w" G
    global _Num4 g, I- w0 d( r8 \) {, V
    temp_data = []* {& T& s; x6 l% J
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
9 R' i# q( M& K9 O( g4 Y    for index, item in enumerate(items) :' I& r+ D1 J9 }" u# Q+ A
            #print item
0 D, E* S, d3 z* ?! [            #print item.h1% R9 v% v' }7 _# N
        #print h.group()
! X' J' n: v/ m9 g* K! O& o            #temp_data.append(item), L0 D( D' ?* m
            #print item.find(re.compile("^a"))- f* ]4 h4 ?2 x" t
            href = item.find(re.compile("^a"))
  L5 m  T4 M& \            #soup = BeautifulSoup(item)
0 r  {6 [6 Q5 }% I2 w3 \6 A; {            #公司名称
. c2 s6 Z1 Z4 [2 o+ d            if item.a:
6 r* ~: h/ b  U3 W( v. T                    data = item.a.string.encode("gbk","ignore")- A/ \  X! z! J) m7 I4 g
                    print data
3 B6 t& P! j! e5 K9 W                    temp_data.append(data)
6 J# ^) }2 X' ]  n- d, O, h2 e( b
' I# ?- S9 m# o* ]: [( i            goods = item.find_all("div", style="font-size:12px;")
2 k& S4 x0 f  P7 |: w( [$ I           
3 @$ y  r- m; Y. [5 k8 _            #经营产品与联系方式& T7 \: @" k/ p/ |0 f
            for i in goods:% V9 Q% Q5 X4 D, ?& a& L6 S
                    data = i.get_text().encode("gbk","ignore")& o' [1 n: L  Q% d- T" Z( b
                    temp_data.append(data)
2 P( t: A4 U$ I- Q& M3 C# ?+ q                    print data0 k* R* H- w5 [
            #b = item.find_all("b")
# Y1 ]' P3 A) @" E2 B# w& n8 s            #print b# U3 L3 Y& L, ?: a- I! W! B% n6 ~
            #链接地址: Q: p$ p/ ]# A. g( o0 q! e+ V
            pat = re.compile(r'href="([^"]*)"')* O8 s0 }0 [" Y) n# \
            h = pat.search(str(item))
: }: W7 b; }6 v1 N4 X            if h:
% m' H4 [9 Q3 k$ m3 Z7 U$ g                    #print h.group(0)
* [& N3 X' J8 t! _; B                    href = h.group(1); t/ i7 \' M7 Q. K
                    print href& d; k1 i9 Y. `0 ~8 i2 r
                    temp_data.append(h.group(1))6 i3 ?' ]( N$ W* i0 V% u0 F3 P' g0 {

6 r& r, f/ k# X2 t" C! M" d            _Num += 1
; ]8 P; G$ Q2 F0 ]+ j+ b            #b = item.find_all(text=re.compile("Dormouse"))! H+ w, _& m/ ]% p
            #pprint(goods)
% Z  w. P! }/ j/ N% N' A) x            #print href
) p, v$ F2 q! V            #pat = re.compile(r'title="([^"]*)"'), }. U6 B( m% X8 P
            #h = pat.search(str(href))/ {! e8 R+ [* w
            #if h:
" V9 T/ N7 f* o" _4 T                    #print h.group(1)5 c  P! J, B! e' l& N
                    #temp_data.append(h.group(1))
6 n# M' h4 _6 V+ [* V9 m    _DATA.append(temp_data)
9 j: g1 Z! p* u6 [6 o6 p
+ \* f+ K9 _& ^  m0 j) \3 t$ ?0 o0 D#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)! D# e+ @; \7 C; }2 x  Z, r, f
#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
7 h% Y3 `& `/ y6 r#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释/ c% N0 _# ~7 s0 e4 l
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)( p; w$ o+ i$ u6 {1 [! v# p

4 R5 ~+ N# h$ l) w2 Rdef main() :
8 A4 b5 z" _# I4 T& Q2 [: X. P0 O    global SHARE_Q
! b6 d4 `9 C7 D' n& h. E/ _    threads = []8 p; W4 F: z5 H- a4 r
    start = time.clock(), H% P' _* l% J; [2 \* ?. z
    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
9 o* I5 o8 X* W; C; |    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
7 H/ x" P. a0 E- s    for index in xrange(20) :   + _7 Q+ T( P/ Y$ C) ^
        SHARE_Q.put(douban_url.format(page = index * 1))
/ G% w; a7 E1 h+ a& V5 k    for i in xrange(_WORKER_THREAD_NUM) :
+ U3 B, V& v6 K: A* S+ s! d: D        thread = MyThread(worker,i)4 X$ }5 r! g$ \/ r
        thread.start()  #线程开始处理任务
( {7 C7 l; ]5 p: E+ n" P) l  W: b5 n# [
+ ]  _* ~; t* A/ E        threads.append(thread)
. s% t, A/ m3 H3 d    for thread in threads :0 N3 m0 }7 U1 O& _& R
        thread.join()' c* w/ ~3 O0 v; ~* w9 A
    SHARE_Q.join()
# t, l- i- S( T7 Q8 D. W    i = 0
$ e. I/ Y, C# S    with open("down.txt", "w+") as my_file :+ T$ S+ Z* B1 H3 h
        for page in _DATA :
: V, K( |$ m* x                i += 1
  d& B! K4 J- R. `3 F                for name in page:, t. [/ D! h; w0 `9 Q5 N
                        my_file.write(name + "\n")6 H( a0 d) A) u) B; |# m

. ~' p5 g% n/ ?' i    print "Spider Successful!!!"7 U' L, x- f& ]6 F9 {
    end = time.clock()% F8 o5 j5 F$ j* h5 K. c
    print u'抓取完成!'
9 \! j+ G! C9 w5 Z9 i, O* ~2 P& c    print u'总页数:',i
& G, a% E4 J4 H' t4 x! g    print u'总条数:',_Num
" v* y2 f: _) ^2 E! y1 v    print u'一共用时:',end-start,u'秒'  {% F' x, `. [% L  U9 s: v
$ G7 q7 Q9 A+ f: |
if __name__ == '__main__':$ O9 j3 D  @8 E  ~' d$ U
    main()( o5 s1 d0 x  q) L

/ k  G: k- J  @, O9 X2 w+ b) _6 D% U/ `2 \- ~9 X* F( |
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-19 09:01 , Processed in 0.366579 second(s), 50 queries .

回顶部