花了一个早上简单学习了一下爬虫,做下记录吧
爬虫
正则表达式
foo ——————字符串“foo” ^foo ——————以“foo”开头的字符串 foo$ ——————以“foo”结尾的字符串 ^foo$ ——————“foo”开头和结尾,(只能是他自己 ) [abc]—————— a 或者b 或者c [a-z] —————— a到z之间任意字母 [^A-Z]——————除了 A-Z这些之外的字符 (gif|jpg)——————“gif”或者 “jpeg” [a-z]+—————— 一个或者多个 a到z之间任意字母 [0-9.-]—————— 0-9之间任意数字,或者 点 或者 横线 ^[a-zA-Z0-9_]{1,}$—————— 至少一个字母数字下划线 ([wx])([yz])—————— wy或wz或xy或xz [^A-Za-z0-9]—————— 字符数字之外的字符 ([A-Z]{3}|[0-9]{4})—————— 三个大写字母或者4个数字
(.+)默认是贪婪匹配
(.+?)为惰性匹配
疑问号让.+的搜索模式从贪婪模式变成惰性模式。
var str = 'aaa <div style="font-color:red;">123456bbb'
<.+?>会匹配<div style="font-color:red;">
<.+>会匹配<div style="font-color:red;">123456</div>
下面举个简单的例子来说明。
1.贪婪匹配是先看整个字符串是否匹配,如果不匹配,它会去掉字符串的最后一个字符,并再次尝试。如果还不匹配,那么再去掉当前最后一个,直到发现匹配或不剩任何字符。
var str='abcdabceba'
/.+b/ //匹配一个或多个任意字符后面跟一个字母b
执行str.match(/.+b/)
第一次(先看整个字符串是否是一个匹配) abcdabceba 不匹配,然后去掉最后一个字符a
第二次(去掉最后一个字符后再匹配) abcdabceb 匹配,返回abcdabceb。
2.惰性匹配是从左侧第一个字符开始向右匹配, 先看第一个字符是不是一个匹配, 如果不匹配就加入下一个字符再尝式匹配, 直到发现匹配...
执行str.match(/.+?b/)
第一次(读入左侧第一个字符) a 不匹配加一个再式
第二次 ab 匹配,返回ab
实例1: 自动爬取贴吧图片并下载(request + re)
import requests import re import bs4 # 根据url获取网页html内容 def getHtmlContent(url): page = requests.get(url) return page.text # 从html中解析出所有jpg图片的url # 百度贴吧html中jpg图片的url格式为:<img ... src="XXX.jpg" width=...> def getJPGs(html): # 解析jpg图片url的正则 jpgReg = re.compile(r'<img.+?class="BDE_Image".+?src="(.+?\.jpg)" ') # 注:这里最后加一个'width'是为了提高匹配精确度 # 解析出jpg的url列表 jpgs = re.findall(jpgReg, html) #print(jpgs) return jpgs # 用图片url下载图片并保存成制定文件名 def downloadJPG(imgUrl,fileName): response = requests.get(imgUrl) img = response.content with open(fileName, 'wb') as f: f.write(img) # 批量下载图片,默认保存到当前目录下 def batchDownloadJPGs(imgUrls): # 用于给图片命名 path = 'C:\\Code\\test\\crawler\\' count = 1 for url in imgUrls: downloadJPG(url,''.join([path,'{0}.jpg'.format(count)])) count = count + 1 # 封装:从百度贴吧网页下载图片 def download(url): html = getHtmlContent(url) jpgs = getJPGs(html) batchDownloadJPGs(jpgs) def main(): url = 'https://tieba.baidu.com/p/2256306796?pn=' for i in range(3, 5): new_url = url + str(i) download(new_url) if __name__ == '__main__': main()
——————————————未完待续——————————————