python爬虫边看边学(数据解析)

数据解析

一、正则表达式

       Regular Expression,正则表达式是一种使用表达式的方式对字符串进行匹配的语法规则。
       我们抓取到的网页源代码本质上就是一个超长的字符串, 想从里面提取内容。用正则再合适不过了。

       正则的优点: 速度快, 效率高, 准确性高

       正则的缺点: 新手上手难度有点高。

       不过只要掌握了正则编写的逻辑关系, 写出一个提取页面内容的正则其实并不复杂。

       正则的语法: 使用元字符进行排列组合来匹配字符串。在线测试正则表达式https://tool.oschina.net/regex/

       元字符: 具有固定含义的特殊符号 常用元字符有以下:

.  匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符

  量词:控制前面的元字符出现的次数

* 重复零次或多次
+ 重复一次或多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

  贪婪匹配和非贪婪匹配

  • 贪婪匹配:匹配更多的字符
  • 非贪婪匹配:匹配尽可能少的字符(*、+、?后带?)

str:‘I love China,I love my homeland,I love China’
reg: I.*China
此时匹配的是:'I love China,I love my homeland,I love China'

reg:I.*?China
此时匹配的是:'I love China'

  带HTML标签

str:<div>I love China</div>
reg:<.*>
匹配结果:<div>I love China</div>

reg:<.*?>
匹配结果:<div>
              </div>


str:<div>I love China</div><span>I love my homeland</span>
reg:<div>.*?</div>
匹配结果:<div>I love China</div>

  

 二、re模块匹配HTML标签

import re

s = """
    <div class='ex1111'><span id='1'>Jack</span></div>
    <div class='ex2222'><span id='2'>Rose</span></div>
    <div class='ex33333'><span id='3'>Merry</span></div>
    <div class='ex44444'><span id='4'>Job</span></div>
    <div class='ex55555'><span id='5'>Smith</span></div>
"""
obj = re.compile(r"<div class='ex(.*?)'><span id='(?P<ttt>\d+?)'>(.*?)</span></div>", re.S)
res = obj.finditer(s)
for i in res:
    print(i.group(1), i.group('ttt'), i.group(3))

 

三、豆瓣爬取前250

import re
import requests
import csv

headers = {'User-Agent': 'Mozilla/5.0 (Windows;U;Windows NT 6.1;en-US;rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
url = 'https://movie.douban.com/top250'
resp = requests.get(url, headers=headers)
page_content = resp.text
obj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>'
                 r'.*?<p class="">.*?<br>(?P<year>.*?)&nbsp', re.S)
result = obj.finditer(page_content)
f = open('data.csv', 'w', encoding='utf-8')
csvwriter = csv.writer(f)

for i in result:
    dic = i.groupdict()
    dic['year'] = dic['year'].strip()
    print(dic)
    csvwriter.writerow(dic.values())
f.close()

  

posted @ 2021-03-28 16:54  wangshanglinju  阅读(93)  评论(0编辑  收藏  举报