[周更]1.正则表达式-爬虫

尝试开始周更ε≡٩(๑>₃<)۶ 一心向学




文章目录

  • [周更]1.正则表达式-爬虫
  • 声明
  • 前言
  • 一、正则表达式
  • 二、使用步骤
  • 1.引入库requests,re,os(pip install)
  • 2.初始化(注意设置header)
  • 3.爬取和正则匹配
  • 4.不断加载网页并继续爬取新网页
  • 5.完整代码
  • 总结



声明

本内容为个人学习笔记,不准被用于商业。

前言

正则表达式主要运用于文本处理中。相较于XPATH和Beautiful Soup将网页源代码文本转化为更易处理的结构,正则表达式直接处理源代码文本,获得信息。只要能够记住规则,使用起来也非常方便。


一、正则表达式

这里我们的爬虫主要爬取网址,所以正则表达式是用来匹配网页网址的。这里介绍一下正则表达式的部分规则。

正则项

匹配内容

(?<=“XXX”)

将匹配"XXX",并将其之后的内容返回,其自身的匹配结果不返回(左右括号是必须的)

(?=“XXX”)

将匹配"XXX",并将其之前的内容返回,其自身的匹配结果不返回(左右括号是必须的)

.

匹配除换行符 \n 之外的任何单字符

?

匹配前面的子表达式零次或一次,解除贪婪匹配

*

匹配前面的子表达式零次或多次。

+

匹配前面的子表达式一次或多次。

[ ]

标记一个中括号表达式的开始和结束,中间放入匹配集合,[xy]即下个匹配是x或y,[^x]即下个匹配不是x

另外,如果要单独匹配这些字符,只需加上斜杠符号转义即可。(如需匹配“ ?”,就需用“?”来匹配)
按照下面的规则组合可得获得网址的正则表达式:
(?<=href=")http:\/\/.*?(?=")(爬取普通网址)
(?<=src=")https:\/\/.*?[^\.][^j][^s](?="[^+])(爬取图片网址)

它们将匹配什么呢?

href=" 开头的,以 " 结束的一串序列,并且只截取中间的网址部分。例:

Python 正则表达爬虫 冒号 正则表达式 爬虫_Python


匹配此处href之后的网址信息

src=" 开头的,以 " 结束的一串序列,并且只截取中间的网址部分。例:

Python 正则表达爬虫 冒号 正则表达式 爬虫_初始化_02


匹配此处src之后的图片网址信息

先介绍这么多,下次要用的话再介绍。

二、使用步骤

1.引入库requests,re,os(pip install)

代码如下:

import requests #用来请求内容
import re #正则表达式库
import os #用来打开文件夹来储存图片
import time #引入是为了减慢爬取速度

2.初始化(注意设置header)

header设置主要是为了防止网页检测到我们使用的是爬虫,因为这是非常简单的反爬机制,反反爬的方法也非常简单,就将header设置为成下面这个样子即可。
代码如下:

start_directory = r'E:\Python\requests模块\Pictures'
#储存图片的位置(**可以修改**)
os.startfile(start_directory)
#调用os,将这个位置设置为储存位置
url = 'https://www.baidu.com/s'
(**可以修改**)
header ={ 
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
    }
urls = [] #用来储存爬取到的网页
urls.append(url) #先放入一个网页
i=1 #记录放入的是第几张图片

3.爬取和正则匹配

没啥好说的, 就利用上面的两个正则表达式用于匹配。

for new_url in urls:
        time.sleep(1)
        requests_get = requests.get(url=new_url,headers = header)
        add_urls = re.findall(r'(?<=href=")http:\/\/.*?(?=")', requests_get.text)
        # add_urls为要加入urls中的网址
        img_urls = re.findall(r'(?<=src=")https:\/\/.*?[^\.][^j][^s](?="[^+])', requests_get.text)
        # img_urls为需要提取图片的网址

4.不断加载网页并继续爬取新网页

不断将网页中存在的网页放入待爬序列中,从而不断进行爬取过程。在打开网页后,也会顺带爬取网页上的图片。

for new_url in urls:
        time.sleep(1)
        #try:
        requests_get = requests.get(url=new_url,headers = header)
        add_urls = re.findall(r'(?<=href=")http:\/\/.*?(?=")', requests_get.text)
        img_urls = re.findall(r'(?<=src=")https:\/\/.*?[^\.][^j][^s](?="[^+])', requests_get.text)
        #将获得的url添加到待爬序列中
        for url in add_urls:
            urls.append(url)
        for url in img_urls:
            time.sleep(1)
            #获得每张图片的内容
            response = requests.get(url,headers = header)
            content = response.content
                
            print(url)
            #以下为储存图片的过程
            if url[-3:] == 'jpg':
                w=open(r'E:\Python\requests模块\Pictures\{}.jpg'.format(i),'wb')
                i+=1
                print('获取到{}张图片'.format(i))
                w.write(content)
            elif url[-4:] == 'jpeg':
                w=open(r'E:\Python\requests模块\Pictures\{}.jpeg'.format(i),'wb')
                i+=1
                print('获取到{}张图片'.format(i))
                w.write(content)
            elif url[-3:] == 'png':
                w=open(r'E:\Python\requests模块\Pictures\{}.png'.format(i),'wb')
                i+=1
                print('获取到{}张图片'.format(i))
                w.write(content)
    #删除已经爬取过的网页
        del new_url

5.完整代码

因为该代码没有对爬取暂停的时刻做限制,理论上来说它会一直进行下去。不过可以通过Ctrl+c等方法强行终止。

import requests
import re
import os
import time
if __name__ == '__main__':
    start_directory = r'E:\Python\requests模块\Pictures'
    os.startfile(start_directory)
    url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_4_dg&wd=%E7%99%BE%E5%BA%A6&oq=https%2526lt%253B%2526lt%253BA%252F%252Fwww.baidu.com%252Fs%2526lt%253B%2526lt%253BFcl%2526lt%253B%2526lt%253BD%2526lt%253B%2526lt%253B26tn%2526lt%253B%2526lt%253BDbaidutop10%2526lt%253B26fr%2526lt%253B%2526lt%253BDtop1000%2526lt%253B26wd%2526lt%253B%2526lt%253BD%2526lt%253B&rsv_pq=92ff880800019e36&rsv_t=9ec5vuWY8HwxgDDLMGrvumBvzWgp1n6wdmO79kYPhZeMugY%2BvYaisFtOXodSlODcCB%2Bb&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=9&rsv_sug1=6&rsv_sug7=101&rsv_sug2=0&rsv_btype=t&inputT=1234&rsv_sug4=110491&rsv_sug=2'
    header ={ 
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
    }
    urls = []
    urls.append(url)
    i=1
   
    #print(requests_get.text)
    #result_urls = re.findall(r'(?<=href=")http:\/\/.*?(?=")', requests_get.text)
    #img_urls = re.findall(r'(?<=src=")https:\/\/.*?[^\.][^j][^s](?="[^+])', requests_get.text)
    for new_url in urls:
        time.sleep(1)
        #try:
        requests_get = requests.get(url=new_url,headers = header)
        add_urls = re.findall(r'(?<=href=")http:\/\/.*?(?=")', requests_get.text)
        img_urls = re.findall(r'(?<=src=")https:\/\/.*?[^\.][^j][^s](?="[^+])', requests_get.text)
        for url in add_urls:
            urls.append(url)
        for url in img_urls:
            time.sleep(1)
            response = requests.get(url,headers = header)
            content = response.content
                
            print(url)
            if url[-3:] == 'jpg':
                w=open(r'E:\Python\requests模块\Pictures\{}.jpg'.format(i),'wb')
                i+=1
                print('获取到{}张图片'.format(i))
                w.write(content)
            elif url[-4:] == 'jpeg':
                w=open(r'E:\Python\requests模块\Pictures\{}.jpeg'.format(i),'wb')
                i+=1
                print('获取到{}张图片'.format(i))
                w.write(content)
            elif url[-3:] == 'png':
                w=open(r'E:\Python\requests模块\Pictures\{}.png'.format(i),'wb')
                i+=1
                print('获取到{}张图片'.format(i))
                w.write(content)
    
        del new_url

总结

感觉这样一周周混下去也不是办法,不如从这周开始每周写点东西。下周就介绍一下多线程爬虫吧。
ᕦ(・ㅂ・)ᕤ(任何不足之处,欢迎大家留言