[周更]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=" 开头的,以 " 结束的一串序列,并且只截取中间的网址部分。例:
匹配此处href之后的网址信息
以 src=" 开头的,以 " 结束的一串序列,并且只截取中间的网址部分。例:
匹配此处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
总结
感觉这样一周周混下去也不是办法,不如从这周开始每周写点东西。下周就介绍一下多线程爬虫吧。
ᕦ(・ㅂ・)ᕤ(任何不足之处,欢迎大家留言)