Python 爬虫学习和实例(2020.12.22)
花了一个早上简单学习了一下爬虫,做下记录吧
爬虫
正则表达式
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() ——————————————未完待续——————————————
课余学习(*^▽^*) 文章被收录于专栏
 记录自己课余的学习~

