- 前言
- 一、北京新发地
- 二、豆瓣
- 总结
前言
sb4的练习,区分re的应用
一、北京新发地
菜价数据是客户端渲染的不在标签里面,而且是json格式,直接拿出来就行了
csv写一行多个数据的时候的时候记得用列表的方式
import requests
from bs4 import BeautifulSoup
import csv
url = "http://www.xinfadi.com.cn/getCat.html"
resp = requests.get(url)
# print(resp.json()) # 本身就是json格式了(字典包含列表,列表里面嵌套字典)
json = resp.json()['list'] # 通过键访问值(内容不在标签里,不需要bs4)
f = open("菜价.csv", mode="w")
writer = csv.writer(f)
# print(json)
for it in json:
name = it['prodName']
low = it['lowPrice']
high = it['highPrice']
avg = it['avgPrice']
date = it['pubDate']
# print(name, low, high, avg, date)
writer.writerow([name, low, high, avg, date])
f.close()
print("over!")
二、豆瓣
定位标签时,找目标区域的唯一标签(排在第一个位置的标签)
获取属性时,必须已经定位到当前所包含属性的标签了,不然会出现none
用csv设置路径时要在后面加上格式
import requests
from bs4 import BeautifulSoup
import time
def main():
baseurl = "https://movie.douban.com/top250"
# 获取图片链接
img_load = getData(baseurl)
# 保存图片
download(img_load)
def download(load_url):
# 拿到下载链接
for key, value in load_url.items(): # 方法返回一个键值对列表,会循环赋值给这两个变量
# 访问下载链接
img_resp = requests.get(value)
# img_resp.content # 拿到下载链接图片的字节
img_name = key # 图片名字
with open("img/" + img_name + ".jpg", mode="wb") as f:
f.write(img_resp.content) # 写进文件里相当于下载了
print("ok!", img_name + ".jpg")
time.sleep(1) # 休息一会
def getData(url):
# 把主页面源代码交给bs
main_page = BeautifulSoup(ask(url), "html.parser")
imglist = main_page.find("ol", class_="grid_view").find_all("img") # 区别关键字和属性class关键字,加个下划线为属性
# print(imglist) # 把所有含li标签的都拿出来了(一部电影信息只有一个li标签)
# 通过遍历所有的li标签和get获取src属性值(想要获取属性值,先通过标签缩小范围,缩小到当前属性所在标签里才可以拿)
# 用字典存
img_load = {}
for img in imglist:
# print(img.get('alt'))
# print(img.get('src'))
img_load[img.get('alt')] = img.get('src')
# print(img_load)
return img_load
def ask(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=head)
# print(resp.text)
return resp.text
if __name__ == "__main__":
main()
print("爬取完毕!")
总结
项目加载新东西时,pcharm会加载索引(之类的),导致越来越来卡,可以进行以下设置
以豆瓣下载图片为例:



