网络爬虫实战||淘宝、股票定向爬虫

正则表达式的概念

regular expression           regex          RE

正则表达式是用来简洁表达一组字符串的表达式。


正则表达式的优势:简洁


正则表达式的语法

RE库的基本使用

当[正则表达式]包含<转义符>时,使用raw string

>>> import re
>>> match=re.search(r'[1-9]\d{5}','BIT 100081')
>>> if match:
	print(match.group(0))

100081

>>> match=re.search(r'[1-9]\d{5}','100081 BIT')
>>> if match:
	match.group(0)

'100081'

>>> import re
>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
['BIT', ' TSU', '']
>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT', ' TSU100084']

>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
['BIT', ' TSU', '']
>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT', ' TSU100084']
>>> import re
>>> for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):
	if m:
		print(m.group(0))

100081
100084

>>> re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 TSU100084')
'BIT:zipcode TSU:zipcode'

RE库的match对象

>>> match=re.search(r'[1-9]\d{5}','BIT 100081')
>>> if match:
	print(match.group(0))

100081
>>> type(match)
<class '_sre.SRE_Match'>

>>> import re
>>> m=re.search(r'[1-9]\d{5}','BIT100081 TSU100084')
>>> m.string
'BIT100081 TSU100084'
>>> m.re
re.compile('[1-9]\\d{5}')
>>> m.pos
0
>>> m.endpos
19
>>> m.group(0)
'100081'
>>> m.start()
3
>>> m.end()
9
>>> m.span()
(3, 9)

RE库的贪婪匹配和最小匹配

贪婪匹配:Re库默认采用贪婪匹配,即输出匹配最长的子串。

>>> match=re.search(r'PY.*N','PYANSNCNDN')
>>> match.group(0)
'PYANSNCNDN'

最小匹配:如何输出最短的子串呢?

>>> match=re.search(r'PY.*?N','PYANSNCNDN')
>>> match.group(0)
'PYAN'

例 淘宝商品比价定向爬虫

向淘宝提交搜索“书包”,分析可知向淘宝提交搜索的接口

定向爬虫可行性

https://www.taobao.com/robots.txt

User-Agent:  *
Disallow:  /

import requests
import re

def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        print("error")

def parsePage(ilt,html):
    try:
        plt=re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)#商品的价格是数字和小数点构成的,可以获得商品的价格以及前面的view price提取出来保存在plt的列表类型中
        tlt=re.findall(r'\"raw_title\"\:\".*?\"',html)#*?是最小匹配,是取出以“title"为界,""作为值的键值对
        for i in range(len(plt)):
            price=eval(plt[i].split(':')[1])
            title=eval(tlt[i].split(':')[1])
            ilt.append([price,title])
    except:
        print("error")

def printGoodsList(ilt):
    tplt="{:4}\t{:8}\t{:16}"
    print(tplt.format("序号","价格","商品名称"))
    count=0
    for g in ilt:
        count=count+1
        print(tplt.format(count,g[0],g[1]))

def main():
    goods='书包'
    depth=4
    start_url='https://s.taobao.com/search?q='+goods
    infoList=[]
    for i in range(depth):
        try:
            url=start_url+'&s='+ str(44*i)
            html=getHTMLText(url)
            parsePage(infoList,html)
        except:
            continue
    printGoodsList(infoList)

main()

输出结果:

==== RESTART: C:/Users/diyhoo/AppData/Local/Programs/Python/Python36/1.py ====
序号  	价格      	商品名称            
   1	159.00  	背包男双肩包休闲时尚潮流高中初中学生书包
   2	39.90   	迪卡侬双肩包男女学生书包健身包运动新款校园20升休闲 KIPSTA
   3	399.00  	Doughnut Macaroon甜甜圈女户外休闲旅行防水书包防水轻便双肩包
   4	68.00   	迪士尼小学生书包1-3-4年级男童女童6-12岁减负护脊儿童双肩背包
   5	29.80   	2017新款双肩包女牛津布韩版潮百搭背包时尚休闲书包学生包2018
   6	99.00   	卡帝乐鳄鱼商务双肩包男 中学生女电脑包 旅行男士背包大容量书包
   7	62.00   	双肩包男背包男士旅行包电脑商务休闲女时尚潮流高中初中学生书包
   8	61.00   	背包男士双肩包时尚潮流初中高中学生书包大学生女商务旅行电脑包
   9	52.00   	男背包旅游休闲商务电脑韩版时尚潮流大高中学生书包旅行双肩包男
  10	49.00   	背包男双肩包高中初中学生韩版书包男时尚潮流青年电脑旅游旅行包
  11	49.00   	书包小学生 1-2-3-6年级男女生减负双肩儿童书包男孩防水护脊背包
  12	59.80   	商务背包男士双肩包韩版潮流旅行包休闲女学生书包简约时尚电脑包
  13	59.00   	迪士尼书包小学生男女1-3-4-6年级米奇减负背包儿童书包8-10-12岁
  14	208.00  	anello双肩包女新款旅行包防盗男背包简约大容量书包潮离家出走包
  15	68.00   	背包男双肩包大容量休闲电脑包韩版高中学生书包男时尚潮流旅行包
  16	125.00  	七匹狼背包男商务双肩包男士旅行休闲时尚潮流电脑青年书包大容量
  17	208.00  	anello双肩包女日本乐天背包ins超火书包妈妈包 alleno离家出走包
  18	116.00  	七匹狼商务双肩包男书包中学生女电脑包旅行包休闲男士背包大容量
  19	59.00   	牛津布双肩包女2018新款潮韩版时尚百搭书包旅行帆布小背包女包包
  20	128.00  	瑞士军刀双肩包瑞士中学生书包女商务男士旅行出差大容量电脑背包
  21	116.00  	七匹狼双肩包男 新款商务男士旅行背包女休闲大容量电脑学生书包
  22	99.00   	瑞士军刀双肩包男瑞士电脑旅行背包女大容量高中大学初中学生书包
  23	61.00   	双肩包女背包2018新款韩版潮牛津布帆布时尚休闲百搭女士旅行简约
  24	99.00   	斐爱旅游背包双肩旅行包女双肩包书包男休闲旅行包轻便户外登山包
  25	119.00  	瑞戈瑞士双肩包男背包瑞士军刀旅行包女休闲大容量学生书包电脑包
  26	79.00   	书包女韩版原宿ulzzang 高中学生2018新款初中生校园甜甜圈双肩包
  27	109.00  	瑞士军刀双肩包瑞士中学生书包女休闲男士商务旅行大容量电脑背包
  28	107.00  	老人头双肩包男韩版电脑包潮流女背包休闲大容量旅行包学生书包男
  29	120.60  	赫登尔双肩包男士潮流背包男韩版旅行包时尚休闲学生书包电脑包潮
  30	133.00  	双肩包男士时尚潮流运动休闲背包电脑旅行包韩版个性书包男大学生
  31	208.00  	anello双肩包女日本乐天背包ins超火书包妈妈包 alleno离家出走包
  32	208.00  	anello双肩包女香港代购防盗旅行包书包大容量防水背包离家出走包
  33	206.00  	莱夫帆布小背包女韩版潮2018新款个性百搭双肩包女士旅行时尚胸包
  34	139.00  	背包男士双肩包休闲旅行时尚潮流青年简约韩版高中学生书包大容量
  35	225.00  	日本anello双肩包女2018新款乐天妈妈背包书包离家出走包alleno男
  36	61.00   	背包男士双肩包韩版青年电脑旅行校园初中高中学生书包男时尚潮流
  37	39.90   	双肩包女2018新款潮女包包韩版时尚旅行包百搭书包软皮迷你小背包
  38	159.00  	莱夫女士双肩包韩版潮2018新款帆布简约时尚个性牛津布迷你小背包
  39	169.00  	商务双肩包男大容量青年短途出差旅行包17寸电脑包多功能防盗背包
  40	131.00  	双肩包男个性休闲17寸男士背包电脑旅行包学生书包男运动时尚潮流
  41	208.00  	【香港直邮】anello双肩包男女离家出走包学生书包旅行包休闲背包
  42	179.10  	国家地理背包女运动户外时尚双肩包男牛津布防水包潮学生情侣书包
  43	139.00  	双肩包男时尚潮流个性电脑背包简约大学生高中书包休闲韩版旅行包
  44	129.00  	男士双肩包男韩版时尚背包男大学生书包潮流旅行包电脑包男包皮包
  45	139.00  	pinkland儿童书包男小学生1-3-4-6年级女孩6-12周岁背包护脊书包
  46	365.00  	unme台湾书包小学生男1-3-6年级儿童书包女双肩护脊减负6-12周岁
  47	149.00  	背包男双肩包2018旅行包休闲韩版大学生青年电脑男士书包时尚潮流
  48	203.00  	日本anello双肩包女帆布防盗书包乐天旅行背包小alleno男潮
  49	119.00  	巴朗新款商务双肩包休闲时尚潮流大学生书包15.6寸电脑包男士背包
  50	58.00   	2018新款双肩包女牛津布背包女包包韩版潮时尚百搭尼龙布休闲书包
  51	62.10   	牛津布双肩包女2018新款百搭背包书包女韩版原宿ulzzang 高中学生
  52	99.00   	旅游包男旅行包大容量双肩包休闲运动包旅行背包女轻便户外登山包
  53	119.00  	双肩背包男休闲多功能男士商务15.6寸电脑包 大容量 简约出差
  54	59.00   	双肩包女包包2018新款韩版潮个性百搭时尚迷你小2017书包女士背包
  55	69.00   	双肩包女2018新款韩版百搭潮女士背包女双肩软皮书包休闲旅行包女
  56	158.00  	小学生书包女孩1-3-4-5-6一年级三四五儿童双肩减负护脊背包女童
  57	299.00  	美旅双肩包男士背包时尚潮流旅行休闲运动韩版大容量书包AY1*001
  58	99.00   	韩国kk树书包小学生男1-3-4-6年级儿童书包女6-12周岁双肩包护脊
  59	119.00  	施维茨男士双肩包大容量背包女商务电脑旅行包休闲潮高中学生书包
  60	134.00  	双肩包男商务防盗笔记本电脑包15.6寸书包男士大容量背包时尚潮流
  61	158.00  	专柜正品JanSport杰斯伯经典双肩背包男女同款学生书包T501纯色
  62	206.00  	anello双肩包 日本代购乐天书包女潮牌ins超火的离家出走包alleno
  63	143.00  	Polo双肩包男 时尚潮流青年书包商务简约皮电脑大学生男士背包
  64	58.50   	2018新款包包牛津布双肩包女韩版潮百搭时尚背包ulzzang学生书包
  65	25.90   	书包小学生1-2-3-6年级男女生 护脊耐磨轻防水儿童双肩包6-12周岁
  66	29.00   	韩版双肩包男时尚潮流书包男士电脑包旅行初中高中大学生休闲背包
  67	169.00  	英伦学院风男士双肩包休闲时尚潮流大容量背包大学生青年韩版书包
  68	225.00  	anello双肩包女日本乐天背包ins超火书包妈妈包 alleno离家出走包
  69	89.00   	米熙休闲运动背包双肩包女书包中学生男时尚潮流大容量旅游旅行包
  70	45.00   	双肩包女包包2018新款韩版潮时尚个性百搭2017牛津帆布小书包背包
  71	169.00  	卡拉羊双肩包女书包小学生六年级中学生初中生高中生男校园韩版潮
  72	116.00  	七匹狼男背包初高中校园学生大容量书包男士商务电脑旅行包双肩包
  73	148.00  	裂狼双肩包男士时尚潮流背包男pu皮休闲男包旅行包青年学生书包潮
  74	52.00   	书包男中学生初中生高中生小学男生背包青少年校园双肩包时尚潮流
  75	59.00   	双肩包男士旅游户外休闲书包时尚潮流大容量轻便旅行包登山背包男
  76	109.00  	韩国kk树儿童书包女小学生书包男1-3-4-6年级6-12岁双肩包护脊
  77	188.00  	莱夫书包女韩版时尚双肩包小帆布百搭尼龙背包2018新款潮牛津布包
  78	79.00   	中学生书包男韩版高中校园小学生女初中生帆布大容量防水双肩背包
  79	170.00  	yok双肩包男大容量时尚潮流大学生书包电脑休闲旅行韩版潮牌背包
  80	61.00   	双肩包女2018新款潮韩版时尚百搭个性休闲包包pu软皮书包旅行背包
  81	25.90   	书包小学生1-2-3-6年级男女生 护脊耐磨轻防水儿童双肩包6-12周岁
  82	118.00  	瑞士军刀双肩包男士背包大容量休闲商务电脑包韩版高中书包旅行包
  83	159.00  	七匹狼背包男休闲时尚牛津帆布学生书包商务旅行电脑包男士双肩包
  84	268.00  	BOPAI博牌电脑背包男户外旅行休闲双肩包商务防盗充电多功能男包
  85	225.00  	台湾unme书包小学生1-2-3年级男女生双肩儿童书包轻防水减负背包
  86	115.20  	双肩包女牛津布2018新款百搭韩版大容量防水尼龙帆布包迷你小背包
  87	59.00   	背包男韩版时尚潮流双肩包休闲商务电脑旅行大容量高中大学生书包
  88	115.00  	LOCCOT骆特双肩包男时尚潮流韩版大学生书包休闲简约旅行背包男
  89	109.00  	汉客出差旅行包时尚背包男商务双肩包女17寸多功能防盗书包电脑包
  90	132.00  	迪士尼小学生书包儿童男孩1-3-4-6年级美国队长男童轻便12周岁5男
  91	14.90   	迪卡侬双肩包男女 休闲旅行迷你双肩背包 轻便小书包 QUBP
  92	49.00   	双肩包女2018新款韩版潮时尚百搭2017牛津布帆布女包包小背包书包
  93	78.00   	双肩包男时尚潮流背包高初中生大学生书包男旅行商务15寸电脑包
  94	45.00   	双肩包小包包女2018新款夏季百搭学生书包潮韩版时尚百搭小背包
  95	99.00   	双肩包男时尚潮流皮高中大学生校园书包休闲旅行男士背包英伦韩版
  96	72.00   	书包小学生男1-3-4-6年级儿童减负护脊女6-12周岁初中学生双肩包
  97	179.00  	皓顿男士双肩包休闲商务电脑背包男女时尚潮流韩版学生百搭背包男
  98	99.00   	双肩包男帆布背包电脑包休闲防水运动后背包男旅行包青年学生书包
  99	179.00  	狼域电脑包女双肩包2018新款商务背包 14/15.6寸笔记本牛津布书包
 100	139.00  	大容量男士双肩包出差旅行多功能防盗15.6寸电脑包书包商务背包男
 101	128.00  	尼龙双肩包女韩版2018新款女包潮时尚牛津布帆布包迷你女士小背包
 102	169.00  	Polo双肩包男时尚潮流青年书包电脑包双肩背包简约商务休闲背包男
 103	249.00  	小米 米兔儿童书包 6-12岁男女小学生潮双肩背包幼儿园可爱背包
 104	58.00   	书包小学生男孩1-3-4-6年级轻便护脊儿童书包男双肩减负男童背包
 105	125.00  	骆特双肩包男时尚潮流韩版背包大学生书包休闲简约电脑包旅行包男
 106	59.00   	小学生书包男童1-3-4年级双肩男孩6-12周岁轻便防水男生儿童书包
 107	116.00  	瑞戈瑞士军刀旅行包旅游双肩包瑞士中学生书包女大容量电脑背包男
 108	930.00  	coach/蔻驰 美国代购 男士背包真皮牛皮旅行休闲双肩书包 F72120
 109	202.00  	日本正品代购anello双肩包男女学生书包休闲旅行包帆布离家出生包
 110	108.00  	布言新款双肩包男皮包时尚潮流背包韩版百搭旅行包英伦大学生书包
 111	68.80   	迪士尼书包小学生男女1-3-4-6年级减负护脊米奇儿童背包6-10-12岁
 112	158.00  	裂狼休闲双肩包男士韩版潮流皮背包男时尚学生书包旅行包电脑男包
 113	76.00   	迪士尼书包小学生男童1-3-4五年级6-12周岁女孩儿童护脊双肩背包
 114	179.00  	美旅吴磊明星同款双肩包大容量商务休闲书包旅行背包电脑包男AG0
 115	116.00  	七匹狼商务双肩包男士背包女韩版中学生书包休闲男包旅行包电脑包
 116	88.00   	小学生书包男1-3-4-6年级儿童书包男孩6-12周岁减负双肩包韩版潮
 117	148.00  	双肩包男士时尚潮流15.6寸电脑包大学生书包男运动休闲学院风背包
 118	258.00  	JanSport旗舰店官网杰斯伯双肩包女书包男T501 008纯色热卖爆款
 119	85.00   	uek幼儿园书包男女孩宝宝1-3-6岁可爱小书包防走失双肩儿童背包
 120	48.00   	小学生书包6-12周岁 女儿童双肩包 3-5年级女童背包 1-3年级女孩
 121	129.00  	卡拉羊双肩包书包中学生男小学生初中生女时尚潮流大容量韩版校园
 122	198.45  	aza牛津布双肩包女包新款韩版2018百搭旅行包学生书包背包男女潮
 123	116.00  	七匹狼双肩包男 韩版女休闲潮包 学生书包电脑包旅行包双肩背包男
 124	152.00  	防盗双肩包女包2018新款韩版潮百搭时尚包包书包帆布牛津布小背包
 125	236.00  	新款anello双肩包ins日本代购麻布背包男女学生书包离家出走包包
 126	44.10   	男双肩包韩版休闲潮流旅行电脑大背包pu皮女个性时尚学生街拍书包
 127	76.00   	书包小学生男1-3-4-6年级韩版减负护脊女6-12周岁儿童护脊双肩包
 128	138.15  	双肩包女2018新款韩版时尚书包学生牛津布旅行背包潮百搭离家出走
 129	69.90   	ins超火双肩包女韩版高中小背包学生校园书包原宿ulzzang2018新款
 130	99.00   	美洲野牛正品商务双肩包男中学生女电脑包旅行男士背包大容量书包
 131	29.00   	双肩包女韩版2018新款潮时尚百搭休闲牛津帆布书包女士旅行小背包
 132	1138.00 	美国COACH/蔻驰代购男包 F72311 F55391双肩背包旅行登山休闲书包
 133	228.00  	anello双肩包日本代购乐天男女书包大容量离家出走包防水旅行背包
 134	159.00  	双肩包男大容量17寸旅行包时尚潮流电脑包商务书包多功能防盗背包
 135	205.00  	anello双肩包女日本代购乐天书包防水背包防盗大容量离家出走包
 136	116.00  	七匹狼双肩包男士运动背包学生书包女潮休闲旅行包电脑包简约时尚
 137	58.00   	时尚背包牛津布休闲双肩包女小韩版书包包潮百搭软皮简约2018新款
 138	49.00   	休闲双肩包男韩版旅游初中高中大学生书包时尚潮流大容量旅行背包
 139	69.00   	双肩包女2018新款包包韩版百搭时尚背包女双肩软皮旅行包书包女包
 140	59.80   	书包男时尚潮流韩版学生帆布背包男双肩包女简约大容量休闲个性
 141	49.00   	小学生书包1-3-6年级男孩女生耐磨减负防水双肩包大容量儿童书包
 142	69.00   	迪士尼书包小学生男童4-6年级1-3-5四五六女6-12周岁儿童米奇书包
 143	58.50   	双肩包女2018新款潮韩版百搭时尚休闲旅行防盗牛津布帆布女士背包
 144	159.00  	佰圣爵士男双肩包时尚潮流背包休闲旅行包简约韩版学生书包电脑包
 145	79.00   	双肩包男旅行大容量行李背包户外登山包多功能手提休闲出差旅游包
 146	138.00  	2018新款双肩包女牛津布韩版潮百搭背包时尚休闲书包女包包旅行包
 147	178.00  	书包小学生男童1-3-4-6年级牛津大学儿童书包6-12周岁一护脊女孩2
 148	129.00  	uek小学生书包男1-3-4-6年级女儿童书包6-12岁幼儿园护脊双肩背包
 149	4099.00 	【直营】MCM 男女通用侧钉STARK中号双肩背包MMK6SVE38
 150	3999.00 	【直营】MCM 男女通用侧钉STARK小号双肩背包MMK6SVE37
 151	359.00  	tigerfamily儿童书包小学生一年级1-2 女男6岁超轻减负护脊双肩包
 152	179.00  	texwood双肩包男时尚潮流男士背包韩版旅行包休闲学生书包电脑包
 153	129.00  	ins书包男大学生潮流甜甜圈双肩包女韩版2018新款帆布背包包
 154	58.50   	牧之逸新款双肩包男休闲简约帆布包背包旅行包学生书包男时尚潮流
 155	49.90   	双肩包女2018新款韩版潮女士休闲背包软皮包包百搭书包时尚旅行包
 156	16.00   	幼儿园书包定做印字印logo儿童双肩包培训班广告书包定制
 157	39.00   	书包男时尚潮流休闲旅行包初中高中小学生校园青少年背包男双肩包
 158	116.00  	七匹狼男士背包双肩包男休闲时尚潮流大容量旅行电脑包大学生书包
 159	108.00  	瑞士军刀双肩包瑞士商务中学生书包女休闲男士大容量旅行电脑背包
 160	158.00  	韩版杯具熊儿童幼儿园书包小学生男童女童小孩3-5-8岁双肩包背包
 161	59.00   	背包男双肩包时尚潮流青年商务旅行大容量男士15.6寸电脑休闲书包
 162	79.00   	【包邮】小米学院休闲双肩包男女2017新款大容量百搭旅游背包
 163	52.00   	牛津布双肩包女韩版2018新款时尚帆布休闲百搭潮旅行小背包大容量
 164	189.00  	双肩包女商务电脑包2018新款牛津布学生书包休闲旅行包尼龙布背包
 165	3.50    	运动防水抽绳双肩包拉绳男女学生小背包袋子 束口袋定制 印字logo
 166	499.00  	Samsonite/新秀丽时尚休闲双肩包男高端商务背包潮轻电脑包36B10
 167	49.00   	儿童书包小学生男生1-3-4-6年级男孩子轻便耐磨男童女定制印logo5
 168	188.00  	B.Duck小黄鸭2018新款双肩包牛津布背包韩版时尚潮书包可爱包包女

你可以将goods的值进行改变从而搜索其他东西。

例 股票数据定向爬虫

百度股票更适合!

import requests
from bs4 import BeautifulSoup
import traceback
import re

def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        print("error")

def getStockList(lst,stockURL):
    html=getHTMLText(stockURL)
    soup=BeautifulSoup(html,'html.parser')
    a=soup.find_all('a')
    for i in a:
        try:
            href=i.attrs['href']
            lst.append(re.findall(r"[s][hz]\d{6}",href)[0])#定义正则表达式:以s开头,中间是h或z然后是6个数字
        except:
            continue

def getStockInfo(lst,stockURL,fpath):
    for stock in lst:
        url=stockURL+stock+".html"
        html=getHTMLText(url)
        try:
            if html=="":
                continue
            infoDict={}
            soup=BeautifulSoup(html,'html.parser')
            stockInfo=soup.find('div',attrs={'class':'stock-bets'})
            
            name=stockInfo.find_all(attrs={'class':'bets-name'})[0]
            infoDict.update({'股票名称':name.text.split()[0]})

            
            keyList=stockInfo.find_all('dt')
            valueList=stockInfo.find_all('dd')
            for i in range(len(keyList)):
                key=keyList[i].text
                val=valueList[i].text
                infoDict[key]=val
            with open(fpath,'a',encoding='utf-8')as f:
                f.write(str(infoDict)+'\n')
        except:
            traceback.print_exc()
            continue
        
def main():
    stock_list_url='http://quote.eastmoney.com/stocklist.html'
    stock_info_url='https://gupiao.baidu.com/stock/'
    output_file='D://BaiduStockInfo.txt'
    slist=[]
    getStockList(slist,stock_list_url)
    getStockInfo(slist,stock_info_url,output_file)

main()

优化后的:

import requests
from bs4 import BeautifulSoup
import traceback
import re

def getHTMLText(url,code='utf-8'):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=code
        return r.text
    except:
        print("error")

def getStockList(lst,stockURL):
    html=getHTMLText(stockURL,'GB2312')
    soup=BeautifulSoup(html,'html.parser')
    a=soup.find_all('a')
    for i in a:
        try:
            href=i.attrs['href']
            lst.append(re.findall(r"[s][hz]\d{6}",href)[0])#定义正则表达式:以s开头,中间是h或z然后是6个数字
        except:
            continue

def getStockInfo(lst,stockURL,fpath):
    count=0
    for stock in lst:
        url=stockURL+stock+".html"
        html=getHTMLText(url)
        try:
            if html=="":
                continue
            infoDict={}
            soup=BeautifulSoup(html,'html.parser')
            stockInfo=soup.find('div',attrs={'class':'stock-bets'})
            
            name=stockInfo.find_all(attrs={'class':'bets-name'})[0]
            infoDict.update({'股票名称':name.text.split()[0]})

            
            keyList=stockInfo.find_all('dt')
            valueList=stockInfo.find_all('dd')
            for i in range(len(keyList)):
                key=keyList[i].text
                val=valueList[i].text
                infoDict[key]=val
            with open(fpath,'a',encoding='utf-8')as f:
                f.write(str(infoDict)+'\n')
                count=count+1
                print('\r当前速度:{:.2f}%'.format(count*100/len(lst)),end='')
        except:
            count=count+1
            print('\r当前速度:{:.2f}%'.format(count*100/len(lst)),end='')
            continue
        
def main():
    stock_list_url='http://quote.eastmoney.com/stocklist.html'
    stock_info_url='https://gupiao.baidu.com/stock/'
    output_file='D://BaiduStockInfo1.txt'
    slist=[]
    getStockList(slist,stock_list_url)
    getStockInfo(slist,stock_info_url,output_file)

main()



猜你喜欢

转载自blog.csdn.net/qq_42020563/article/details/80677022