一、正则在爬虫中的应用
请求数据部分大同小异,都是向网站发送请求然后获取数据,然后正则主要是对获取的数据进行操作;
对于我们想要获取的内容,利用正则表达式匹配我们想要的内容,其他不变的内容原样写
示例如下:
import csv
import requests
from re import findall
from bs4 import BeautifulSoup
resp=requests.get('https://cd.zu.ke.com/zufang')
if resp.status_code==200:
print('请求成功')
result=resp.text
print(result)
# 解析数据
names=findall(r'(?s)<a class="twoline".+?>(.+?)</a>',result)
names=[x.strip() for x in names]
prices=findall(r'<span class="content__list--item-price"><em>(\d+)</em>',result)
# print(prices)
# 使用map()将名称和价格合并
house=map(lambda i,j:(i,j),names,prices)
# 写入文件
with open('file/租房信息.csv','a',encoding='utf-8',newline='') as f:
writer=csv.writer(f)
writer.writerow(['名称','价格'])
writer.writerows(list(house))
二、图片下载
单个图片下载
获取指定图片的地址,然后向地址发送请求-获取图片数据-将数据写入到文件中
示例如下:
imimport requests
from re import findall
def download_image(url:str):
# 1对图片地址发送请求
response=requests.get(url) # 2获取图片数据
data=response.content
# 3将数据写入到图片文件中
with open('file/宝儿姐.jpeg','wb') as f:
f.write(data)
if __name__ == '__main__':
download_image('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fblog%2F202010%2F30%2F20201030203647_xonrv.thumb.1000_0.jpg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662863010&t=c71b4927e303ff5b5cf31eb68f2f7fcb')
图片批量下载
图片批量下载的时候存在一个问题,那就是下载的每个图片名字的命名,这个地方就会用到一个模块
from uuid import uuid1
与单个图片下载有所不同的是获取图片地址和存储文件的时候,获取的时候可以用select,这样就得到一个列表,通过循环遍历得到每个图片地址,在存储图片文件的时候利用uuid
给每个图片取一个不一样的名字
示例如下:
from uuid import uuid1 #每次创建一个不一样的id值
import requests
from re import findall
# 1 获取整个页面的数据
response=requests.get('https://cd.zu.ke.com/zufang')
content=response.text
# 2 解析数据获取所有房屋的图片地址
all_image=findall(r'(?s)<a\s+class="content__list--item--aside".+?>\s+<img.+?data-src="(.+?)"',content)
# print(all_image)
for i in all_image:
# 3 对图片地址发送请求
resp = requests.get(i)
content=resp.content
# 4 将数据写入到图片文件中
with open(f'file/image/{uuid1()}.jpeg','wb') as f:
f.write(content)