北理Python爬虫Week3

课程地址:https://www.icourse163.org/course/BIT-1001870001
笔记内容结合课件整理。

这里对北理爬虫课程第三周内容回顾,本周主要介绍了正则表达式

1.正则表达式的概念

正则表达式是用来简洁表达一组字符串的表达式
正则表达式是一种通用的字符串表达框架
进一步
正则表达式是一种针对字符串表达“简洁” 和“特征” 思想的工具
正则表达式可以用来判断某字符串的特征归属

正则表达式的常用操作符

操作符 说明 实例
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围 [abc]表示a、 b、 c,[a‐z]表示a到z单个字符
非字符集,对单个字符给出排除范围 abc表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展 abc* 表示 ab、 abc、 abcc、 abccc等
+ 前一个字符1次或无限次扩展 abc+ 表示 abc、 abcc、 abccc等
? 前一个字符0次或1次扩展 abc? 表示 ab、 abc
| 左右表达式任意一个 abc|def 表示 abc、 def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc、 abbc
^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头
\$ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾
( ) 分组标记,内部只能使用 | 操作符 (abc)表示abc,(abc|def)表示abc、 def
\d 数字,等价于[0‐9]
\w 单词字符,等价于[A‐Za‐z0‐9_]

来看几个具体例子

正则表达式 对应字符串
P(Y|YT|YTH|YTHO)?N ‘PN’、 ‘PYN’、 ‘PYTN’、 ‘PYTHN’、 ‘PYTHON’
PYTHON+ ‘PYTHON’、 ‘PYTHONN’、 ‘PYTHONNN’ …
PY[TH]ON ‘PYTON’、 ‘PYHON’
PYTH?ON ‘PYON’、 ‘PYaON’、 ‘PYbON’、 ‘PYcON’…
PY{:3}N ‘PN’、 ‘PYN’、 ‘PYYN’、 ‘PYYYN’

再来看几个经典正则表达式的例子

正则表达式 对应字符串
^[A‐Za‐z]+\$ 由26个字母组成的字符串
^[A‐Za‐z0‐9]+\$ 由26个字母和数字组成的字符串
^‐?\d+\$ 整数形式的字符串
^[0‐9]*[1‐9][0‐9]*\$ 正整数形式的字符串
[1‐9]\d{5} 中国境内邮政编码,6位
[\u4e00‐\u9fa5] 匹配中文字符
\d{3}‐\d{8}|\d{4}‐\d{7} 国内电话号码,010‐68913536

2.Re库的基本使用

Re库是Python的标准库,主要用于字符串匹配

Re库主要功能函数

函数 说明
re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

下面分别介绍下

  • 1.re.search(pattern, string, flags=0)
    在一个字符串中搜索匹配正则表达式的第一个位置返回match对象
    ∙ pattern : 正则表达式的字符串或原生字符串表示
    ∙ string : 待匹配字符串
    ∙ flags : 正则表达式使用时的控制标记
    这里再详细介绍下flags参数
常用标记 说明
re.I re.IGNORECASE 忽略正则表达式的大小写,[A‐Z]能够匹配小写字符
re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S re.DOTALL 正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符
1
2
3
4
5
import re
match=re.search(r'[1-9]\d{5}','BIT 100081')

if match:
print(match.group(0))
100081
  • 2.re.match(pattern, string, flags=0)
    从一个字符串的开始位置起匹配正则表达式返回match对象
    ∙ pattern : 正则表达式的字符串或原生字符串表示
    ∙ string : 待匹配字符串
    ∙ flags : 正则表达式使用时的控制标记

re.match和re.search最大的不同在于match从开始位置起匹配

1
2
3
4
5
6
7
import re
match=re.match(r'[1-9]\d{5}','BIT 100081')

if match:
print(match.group(0))

match.group(0)
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-5-fecc6e9f4c70> in <module>()
      5     print(match.group(0))
      6 
----> 7 match.group(0)


AttributeError: 'NoneType' object has no attribute 'group'
1
2
3
4
5
import re
match=re.match(r'[1-9]\d{5}','100081 BIT')

if match:
print(match.group(0))
100081
  • 3.re.findall(pattern, string, flags=0)
    搜索字符串,以列表类型返回全部能匹配的子串
    ∙ pattern : 正则表达式的字符串或原生字符串表示
    ∙ string : 待匹配字符串
    ∙ flags : 正则表达式使用时的控制标记
1
2
3
4
import re
ls=re.findall(r'[1-9]\d{5}','BIT100081 TSU100084')

ls
['100081', '100084']
  • 4.re.split(pattern, string, maxsplit=0, flags=0)
    将一个字符串按照正则表达式匹配结果进行分割返回列表类型
    ∙ pattern : 正则表达式的字符串或原生字符串表示
    ∙ string : 待匹配字符串
    ∙ maxsplit: 最大分割数,剩余部分作为最后一个元素输出
    ∙ flags : 正则表达式使用时的控制标记
1
2
import re
re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
['BIT', ' TSU', '']
1
re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT', ' TSU100084']
  • 5.re.finditer(pattern, string, flags=0)
    搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
    ∙ pattern : 正则表达式的字符串或原生字符串表示
    ∙ string : 待匹配字符串
    ∙ flags : 正则表达式使用时的控制标记
1
2
3
4
import re
for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):
if m:
print(m.group(0))
100081
100084
  • 6.re.sub(pattern, repl, string, count=0, flags=0)
    在一个字符串中替换所有匹配正则表达式的子串返回替换后的字符串
    ∙ pattern : 正则表达式的字符串或原生字符串表示
    ∙ repl : 替换匹配字符串的字符串
    ∙ string : 待匹配字符串
    ∙ count : 匹配的最大替换次数
    ∙ flags : 正则表达式使用时的控制标记
1
2
import re
re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 TSU100084')
'BIT:zipcode TSU:zipcode'

Re库的另一种等价用法

函数式用法:一次性操作
rst = re.search(r’[1‐9]\d{5}’, ‘BIT 100081’)

面向对象用法:编译后的多次操作
pat = re.compile(r’[1‐9]\d{5}’)
rst = pat.search(‘BIT 100081’)

regex = re.compile(pattern, flags=0)
将正则表达式的字符串形式编译成正则表达式对象
∙ pattern : 正则表达式的字符串或原生字符串表示
∙ flags : 正则表达式使用时的控制标记

Re库的Match对象

Match对象是一次匹配的结果,包含匹配的很多信息

1
2
3
4
5
6
7
import re
match=re.search(r'[1-9]\d{5}','BIT 100081')

if match:
print(match.group(0))

type(match)
100081





_sre.SRE_Match

Match对象的属性

属性 说明
.string 待匹配的文本
.re 匹配时使用的patter对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

Match对象的方法

方法 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串的开始位置
.end() 匹配字符串在原始字符串的结束位置
.span() 返回(.start(), .end())
1
2
import re
m=re.search(r'[1-9]\d{5}','BIT 100081')
1
m.string
'BIT 100081'
1
m.re
re.compile(r'[1-9]\d{5}', re.UNICODE)
1
m.pos
0
1
m.endpos
10
1
m.group(0)
'100081'
1
m.start()
4
1
m.end()
10
1
m.span()
(4, 10)

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

实例

1
2
match = re.search(r'PY.*N', 'PYANBNCNDN')
match.group(0)

同时匹配长短不同的多项,返回哪一个呢?

1
2
3
import re
match = re.search(r'PY.*N', 'PYANBNCNDN')
match.group(0)
'PYANBNCNDN'

Re库默认采用贪婪匹配,即输出匹配最长的子串。那么如何输出最短的子串呢?这里就要用到最小匹配操作符了。

最小匹配操作符

操作符 说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配

只要长度输出可能不同的,都可以通过在操作符后增加?变成最小匹配

1
2
3
4
import re

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

3.“淘宝商品比价定向爬虫”

程序的结构设计
步骤1:提交商品搜索请求,循环获取页面
步骤2:对于每个页面,提取商品名称和价格信息
步骤3:将信息输出到屏幕上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import requests
import re

#获取页面信息
def getHTMLText(url):
try:
r=requests.get(url,timeout=200)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""

#解析页面
def parsePage(ilt,html):
try:
tlt=re.findall(r'\"raw_title\"\:\".*?\"',html)
plt=re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
for i in range(len(plt)):
price=eval(plt[i].split(":")[1])
title=eval(tlt[i].split(":")[1])
ilt.append([price,title])
except:
print("")

#打印信息
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=2
start_url="https://s.taobao.com/search?q="+goods
infoList=[]
for i in range(depth):
try:
url=start_url+"&s="+str(i*44)
html=getHTMLText(url)
parsePage(infoList,html)
except:
continue
printGoodsList(infoList)

main()
序号      价格          商品名称            
   1    49.00       背包男双肩包高中初中学生韩版书包男时尚潮流青年电脑旅游旅行包
   2    139.00      双肩包男时尚潮流个性电脑背包简约大学生高中书包休闲韩版旅行包
   3    109.00      卡帝乐鳄鱼商务双肩包男 中学生女电脑包 旅行男士背包大容量书包
   4    225.00      日本anello双肩包女妈咪防盗乐天学生背包书包离家出走包alleno男
   5    225.00      日本anello双肩包女牛津布防盗书包乐天旅行背包电脑包alleno男士
   6    203.00      日本anello双肩包女帆布防盗书包乐天旅行背包小电脑包alleno男潮
   7    129.00      七匹狼双肩包男 新款商务男士旅行背包女休闲大容量电脑学生书包
   8    79.00       书包小学生男1-3-4-6年级儿童减负护脊女6-12周岁初中学生双肩包
   9    139.00      瑞戈瑞士军刀旅行包旅游双肩包瑞士中学生书包女大容量电脑背包男
  10    29.80       2017新款双肩包女牛津布韩版潮百搭背包时尚休闲书包学生包2018
  11    59.00       背包男韩版时尚潮流双肩包休闲商务电脑旅行大容量高中大学生书包
  12    59.00       书包男中学生初中生高中生小学男生背包青少年校园双肩包时尚潮流
  13    55.00       双肩包女包包2018新款韩版潮时尚个性百搭2017牛津帆布小书包背包
  14    148.00      双肩包男士时尚潮流15.6寸电脑包大学生书包男运动休闲学院风背包
  15    65.00       2018新款牛津布双肩包女包包韩版潮百搭时尚女背包尼龙布休闲书包
  16    99.00       米熙休闲运动背包双肩包女书包中学生男时尚潮流大容量旅游旅行包
  17    59.00       牛津布双肩包女2018新款潮韩版时尚百搭书包旅行帆布小背包女包包
  18    139.00      pinkland儿童书包男小学生1-3-4-6年级女孩6-12周岁背包护脊书包
  19    99.00       双肩包男帆布背包电脑包休闲防水运动后背包男旅行包青年学生书包
  20    119.00      双肩背包男休闲多功能男士商务15.6寸电脑包 大容量 简约出差
  21    69.00       双肩包女2018新款包包韩版百搭时尚背包女双肩软皮旅行包书包女包
  22    249.00      小米 米兔儿童书包 6-12岁男女小学生潮双肩背包幼儿园可爱背包
  23    59.00       双肩包女2018新款韩版潮时尚百搭2017牛津布帆布女包包小背包书包
  24    69.90       2018新款包包牛津布双肩包女韩版潮百搭时尚背包ulzzang学生书包
  25    125.00      瑞士军刀瑞戈双肩包男士背包瑞士旅行包初中学生书包旅游包电脑包
  26    45.00       小学生书包龙人1-3-6年级女孩超轻防水减负双肩包6-12岁儿童背包
  27    299.00      BOPAI博牌电脑背包男户外旅行休闲双肩包商务防盗充电多功能男包
  28    69.00       背包男士双肩包韩版青年电脑旅行校园初中高中学生书包男时尚潮流
  29    119.00      韩国kk树书包小学生男1-3-4-6年级儿童书包女6-12周岁双肩包护脊
  30    29.00       韩版双肩包男时尚潮流书包男士电脑包旅行初中高中大学生休闲背包
  31    69.00       双肩包女2018新款潮韩版时尚百搭个性休闲包包pu软皮书包旅行背包
  32    179.00      双肩包男大容量17寸旅行包时尚潮流电脑包商务书包多功能防盗背包
  33    119.00      美洲野牛正品商务双肩包男中学生女电脑包旅行男士背包大容量书包
  34    148.00      裂狼双肩包男士时尚潮流背包男pu皮休闲男包旅行包青年学生书包潮
  35    118.00      瑞士军刀双肩包男士背包大容量休闲商务电脑包韩版高中书包旅行包
  36    25.90       书包小学生1-2-3-6年级男女生 护脊耐磨轻防水儿童双肩包6-12周岁
  37    118.00      布言新款双肩包男皮包时尚潮流背包韩版百搭旅行包英伦大学生书包
  38    59.00       双肩包男士旅游户外休闲书包时尚潮流大容量轻便旅行包登山背包男
  39    49.00       背包男时尚潮流高中书包大学生旅行男士双肩包休闲韩版校园旅游包
  40    169.00      英伦学院风男士双肩包休闲时尚潮流大容量背包大学生青年韩版书包
  41    499.00      国家地理背包女运动户外时尚双肩包男牛津布防水包潮学生情侣书包
  42    129.00      七匹狼男士背包双肩包男休闲时尚潮流大容量旅行电脑包大学生书包
  43    158.00      双肩包女牛津布2018新款百搭韩版大容量防水尼龙帆布包迷你小背包
  44    158.00      双肩包男商务防盗笔记本电脑包15.6寸书包男士大容量背包时尚潮流

这里再增加两个字段,店名,地区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import requests
import re

#获取页面信息
def getHTMLText(url):
try:
r=requests.get(url,timeout=200)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""

#解析页面
def parsePage(ilt,html):
try:
tlt=re.findall(r'\"raw_title\"\:\".*?\"',html)
plt=re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
nlt=re.findall(r'"nick":".*?"',html)
llt=re.findall(r'"item_loc":".*?"',html)
for i in range(len(plt)):
price=eval(plt[i].split(":")[1])
title=eval(tlt[i].split(":")[1])
name=eval(nlt[i].split(":")[1]).strip()
loc=eval(llt[i].split(":")[1]).strip()
ilt.append([price,title,name,loc])
except:
print("")

#打印信息
def printGoodsList(ilt):
tplt="{:4}\t{:8}\t{:20}\t{:18}\t{:16}"
print(tplt.format("序号","价格","店名","地区","商品名称"))
count=0
for g in ilt:
count=count+1
print(tplt.format(count,g[0],g[2],g[3],g[1]))

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

main()
序号      价格          店名                      地区                    商品名称            
   1    219.00      卡拉羊维德邦尼专卖店              广东 惠州                 卡拉羊小学生书包减负护脊男女孩2-3-5年级
   2    39.90       迪卡侬旗舰店                  江苏 苏州                 迪卡侬双肩包男女学生书包健身包运动新款校园20升休闲 KIPSTA
   3    139.00      施维茨十字广州专卖店              广东 广州                 施维茨男士双肩包大容量背包女商务电脑旅行包休闲潮高中学生书包
   4    59.80       wolfhorse箱包旗舰店          广东 广州                 商务背包男士双肩包韩版潮流旅行包休闲女学生书包简约时尚电脑包
   5    79.00       妙心母婴专营店                 上海                    迪士尼小学生书包1-3-4年级男童女童6-12岁减负护脊儿童双肩背包
   6    179.00      莱夫箱包旗舰店                 广东 广州                 莱夫女士双肩包韩版潮2018新款帆布简约时尚个性牛津布迷你小背包
   7    249.00      莱夫箱包旗舰店                 广东 广州                 莱夫帆布小背包女韩版潮2018新款个性百搭双肩包女士旅行时尚胸包
   8    129.00      septwolves七匹狼旗舰店        浙江 杭州                 七匹狼双肩包男 韩版女休闲潮包 学生书包电脑包旅行包双肩背包男
   9    129.00      septwolves七匹狼旗舰店        浙江 杭州                 七匹狼商务双肩包男书包中学生女电脑包旅行包休闲男士背包大容量
  10    49.00       dr米其学生书包店               湖南 邵阳                 书包小学生 1-2-3-6年级男女生减负双肩儿童书包男孩防水护脊背包
  11    559.00      fjallraven旗舰店           江苏 扬州                 Fjallraven/北极狐双肩包kanken书包运动包女户外包旅行背包23510
  12    158.00      名鞋城                     上海                    专柜正品JanSport杰斯伯经典双肩背包男女同款学生书包T501纯色
  13    119.00      巴朗旗舰店                   广东 广州                 巴朗新款商务双肩包休闲时尚潮流大学生书包15.6寸电脑包男士背包
  14    69.00       aspensport旗舰店           福建 泉州                 双肩包男背包男士旅行包电脑休闲旅游女时尚潮流高中初中学生书包
  15    139.00      赫登尔旗舰店                  广东 广州                 赫登尔双肩包男士潮流背包男韩版旅行包时尚休闲学生书包电脑包潮
  16    208.00      豪迈足来足往                  香港 九龙                 anello双肩包女香港代购防盗旅行包书包大容量防水背包离家出走包
  17    208.00      fengcai678              香港 九龙                 【香港直邮】anello双肩包男女离家出走包学生书包旅行包休闲背包
  18    79.00       石头村的小伙                  广东 广州                 书包女韩版原宿ulzzang 高中学生2018新款初中生校园甜甜圈双肩包
  19    149.00      唐酷旗舰店                   广东 广州                 双肩包男士时尚潮流背包韩版个性书包男大学生运动休闲电脑旅行包
  20    29.90       a455157529              湖南 邵阳                 书包小学生1-2-3-6年级男女生 护脊耐磨轻防水儿童双肩包6-12周岁
  21    149.00      小米官方旗舰店                 北京                    小米双肩包简约休闲多功能书包男女笔记本电脑包时尚潮流旅行背包
  22    69.00       仕墨梵旗舰店                  浙江 金华                 背包男士双肩包时尚潮流初中高中学生书包大学生女商务旅行电脑包
  23    59.00       迅步母婴专营店                 湖北 武汉                 迪士尼书包小学生男女1-3-4-6年级米奇减负背包儿童书包8-10-12岁
  24    69.00       爱潮鸟旗舰店                  浙江 杭州                 双肩包女包包2018新款韩版潮个性百搭时尚迷你小2017书包女士背包
  25    208.00      时尚爱购潮店                  上海                    anello双肩包女日本乐天背包ins超火书包妈妈包 alleno离家出走包
  26    139.00      瑞戈日进专卖店                 广东 广州                 瑞士军刀双肩包男瑞士电脑旅行背包女大容量高中大学初中学生书包
  27    59.00       沃曼威斯旗舰店                 广东 广州                 男背包旅游休闲商务电脑韩版时尚潮流大高中学生书包旅行双肩包男
  28    189.00      尼格尔旗舰店                  广东 广州                 商务双肩包男大容量青年短途出差旅行包17寸电脑包多功能防盗背包
  29    138.00      鑫运箱包专营店                 广东 广州                 瑞戈瑞士军刀双肩包瑞士中学生书包女休闲男士旅行大容量电脑背包
  30    138.00      zoger旗舰店                广东 广州                 双肩包女背包2018新款韩版潮牛津布帆布百搭防盗女士旅行休闲包包
  31    149.00      凡语者旗舰店                  湖南 长沙                 双肩包男个性休闲17寸男士背包电脑旅行包学生书包男运动时尚潮流
  32    69.00       依璐梦妮旗舰店                 广东 广州                 2018新款双肩包女牛津布韩版潮百搭背包时尚休闲书包女包包旅行包
  33    139.00      七匹狼楚雅专卖店                上海                    七匹狼背包男商务双肩包男士旅行休闲时尚潮流电脑青年书包大容量
  34    169.00      hautton旗舰店              广东 广州                 背包男士双肩包休闲旅行时尚潮流青年简约韩版高中学生书包大容量
  35    68.00       控强旗舰店                   广东 广州                 背包男双肩包大容量休闲电脑包韩版高中学生书包男时尚潮流旅行包
  36    129.00      chuli初丽旗舰店              广东 广州                 男士双肩包男韩版时尚背包男大学生书包潮流旅行包电脑包男包皮包
  37    139.00      希卡旗舰店                   上海                    双肩包男时尚潮流个性电脑背包简约大学生高中书包休闲韩版旅行包
  38    109.00      卡帝乐鳄鱼佰赞诚专卖店             浙江 温州                 卡帝乐鳄鱼商务双肩包男 中学生女电脑包 旅行男士背包大容量书包
  39    225.00      童花头布布                   上海                    日本anello双肩包女妈咪防盗乐天学生背包书包离家出走包alleno男
  40    225.00      洺涛服饰                    上海                    日本anello双肩包女牛津布防盗书包乐天旅行背包电脑包alleno男士
  41    203.00      潮鞋商城                    上海                    日本anello双肩包女帆布防盗书包乐天旅行背包小电脑包alleno男潮
  42    129.00      七匹狼开地专卖店                上海                    七匹狼双肩包男 新款商务男士旅行背包女休闲大容量电脑学生书包
  43    79.00       顺时母婴专营店                 广东 广州                 书包小学生男1-3-4-6年级儿童减负护脊女6-12周岁初中学生双肩包
  44    139.00      瑞戈箱包旗舰店                 广东 广州                 瑞戈瑞士军刀旅行包旅游双肩包瑞士中学生书包女大容量电脑背包男
  45    29.80       爱洛唯旗舰店                  北京                    2017新款双肩包女牛津布韩版潮百搭背包时尚休闲书包学生包2018
  46    59.00       骆佰斯旗舰店                  广东 广州                 背包男韩版时尚潮流双肩包休闲商务电脑旅行大容量高中大学生书包
  47    59.00       风动旗舰店                   广东 广州                 书包男中学生初中生高中生小学男生背包青少年校园双肩包时尚潮流
  48    55.00       爱潮鸟旗舰店                  浙江 杭州                 双肩包女包包2018新款韩版潮时尚个性百搭2017牛津帆布小书包背包
  49    148.00      梵瑞恩箱包旗舰店                广东 广州                 双肩包男士时尚潮流15.6寸电脑包大学生书包男运动休闲学院风背包
  50    65.00       依璐梦妮旗舰店                 广东 广州                 2018新款牛津布双肩包女包包韩版潮百搭时尚女背包尼龙布休闲书包
  51    99.00       米熙箱包旗舰店                 广东 广州                 米熙休闲运动背包双肩包女书包中学生男时尚潮流大容量旅游旅行包
  52    59.00       粹鸟旗舰店                   浙江 台州                 牛津布双肩包女2018新款潮韩版时尚百搭书包旅行帆布小背包女包包
  53    139.00      pinkland旗舰店             广东 广州                 pinkland儿童书包男小学生1-3-4-6年级女孩6-12周岁背包护脊书包
  54    99.00       摩尔卡登旗舰店                 广东 广州                 双肩包男帆布背包电脑包休闲防水运动后背包男旅行包青年学生书包
  55    119.00      doorqu旗舰店               上海                    双肩背包男休闲多功能男士商务15.6寸电脑包 大容量 简约出差
  56    69.00       七扣旗舰店                   河北 保定                 双肩包女2018新款包包韩版百搭时尚背包女双肩软皮旅行包书包女包
  57    249.00      小米官方旗舰店                 北京                    小米 米兔儿童书包 6-12岁男女小学生潮双肩背包幼儿园可爱背包
  58    59.00       爱潮鸟旗舰店                  浙江 杭州                 双肩包女2018新款韩版潮时尚百搭2017牛津布帆布女包包小背包书包
  59    69.90       大脸兔旗舰店                  广东 广州                 2018新款包包牛津布双肩包女韩版潮百搭时尚背包ulzzang学生书包
  60    125.00      瑞戈灵渊专卖店                 广东 广州                 瑞士军刀瑞戈双肩包男士背包瑞士旅行包初中学生书包旅游包电脑包
  61    45.00       wxkt888                 湖南 长沙                 小学生书包龙人1-3-6年级女孩超轻防水减负双肩包6-12岁儿童背包
  62    299.00      博牌旗舰店                   广东 广州                 BOPAI博牌电脑背包男户外旅行休闲双肩包商务防盗充电多功能男包
  63    69.00       木村耀司旗舰店                 上海                    背包男士双肩包韩版青年电脑旅行校园初中高中学生书包男时尚潮流
  64    119.00      kocotree旗舰店             浙江 湖州                 韩国kk树书包小学生男1-3-4-6年级儿童书包女6-12周岁双肩包护脊
  65    29.00       朗斐旗舰店                   河北 石家庄                韩版双肩包男时尚潮流书包男士电脑包旅行初中高中大学生休闲背包
  66    69.00       韩雅伊人旗舰店                 浙江 台州                 双肩包女2018新款潮韩版时尚百搭个性休闲包包pu软皮书包旅行背包
  67    179.00      reeyee旗舰店               广东 广州                 双肩包男大容量17寸旅行包时尚潮流电脑包商务书包多功能防盗背包
  68    119.00      美洲野牛旗舰店                 广东 广州                 美洲野牛正品商务双肩包男中学生女电脑包旅行男士背包大容量书包
  69    148.00      裂狼旗舰店                   广东 广州                 裂狼双肩包男士时尚潮流背包男pu皮休闲男包旅行包青年学生书包潮
  70    118.00      施维茨十字裳酷专卖店              上海                    瑞士军刀双肩包男士背包大容量休闲商务电脑包韩版高中书包旅行包
  71    25.90       zhou2613223             湖南 邵阳                 书包小学生1-2-3-6年级男女生 护脊耐磨轻防水儿童双肩包6-12周岁
  72    118.00      布言旗舰店                   北京                    布言新款双肩包男皮包时尚潮流背包韩版百搭旅行包英伦大学生书包
  73    59.00       沃曼威斯丰傲专卖店               广东 广州                 双肩包男士旅游户外休闲书包时尚潮流大容量轻便旅行包登山背包男
  74    49.00       upza旗舰店                 广东 广州                 背包男时尚潮流高中书包大学生旅行男士双肩包休闲韩版校园旅游包
  75    169.00      bodachel旗舰店             广东 深圳                 英伦学院风男士双肩包休闲时尚潮流大容量背包大学生青年韩版书包
  76    499.00      nationalgeographic旗舰店    广东 广州                 国家地理背包女运动户外时尚双肩包男牛津布防水包潮学生情侣书包
  77    129.00      septwolves诚信达专卖店        上海                    七匹狼男士背包双肩包男休闲时尚潮流大容量旅行电脑包大学生书包
  78    158.00      yoya旗舰店                 广东 广州                 双肩包女牛津布2018新款百搭韩版大容量防水尼龙帆布包迷你小背包
  79    158.00      马可莱登旗舰店                 广东 广州                 双肩包男商务防盗笔记本电脑包15.6寸书包男士大容量背包时尚潮流
  80    59.00       文博士旗舰店                  湖南 邵阳                 小学生书包男童1-3-4年级双肩男孩6-12周岁轻便防水男生儿童书包

4.股票数据定向爬虫

程序的结构设计
步骤1:从东方财富网获取股票列表
步骤2:根据股票列表逐个到百度股票获取个股信息
步骤3:将结果存储到文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import requests
from bs4 import BeautifulSoup
import traceback
import re

#获取页面信息
def getHTMLText(url):
try:
r=requests.get(url,timeout=200)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""

#获取股票列表
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])
except:
continue

#获取股票信息
def getStockInfo(lst,stockURL,fpath):
print(lst)
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)

再对代码做些优化处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import requests
from bs4 import BeautifulSoup
import traceback
import re

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

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])
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:/BaiduStockInfo.txt'
slist=[]
getStockList(slist, stock_list_url)
getStockInfo(slist, stock_info_url, output_file)

main()
当前进度: 1.95%