安庆市网站建设_网站建设公司_改版升级_seo优化
2026/1/16 21:19:04 网站建设 项目流程

BeautifulSoup

蔬菜网

​ (完整代码再文后)

​ 首先再基础的部分,和re正则不同的是,我们要先对拿到的网页源代码进行解析。image-20260116164725356

​ 接着我们观察一下源代码,这里我们要爬的是网页中蔬菜的价格。image-20260116165230774

我们可以发现所有的价格品类等信息都在table标签下面,我们可以用beautifulsoup语句提取这个标签下所有的内容,这里我们选取class="bjtbl"作为选取条件的属性和属性值(如果别的没有重复也可以用别的)

<table cellspacing="1" cellpadding="0" width="100%" bgcolor="#f2f2e7" class="bjtbl">

image-20260116165806000

选取完之后打印看一下效果,但是我们发现第一行的报价日期、产地、类别等字样也被收集进来了,这时候我们,观察网页源代码可以发现第一行的内容也在table标签下,也被收入进来了,那我们在进行再一次筛选的时候需要剔除第一行的项目。

tr代表了一行数据,我们把每一行数据提取出来,再在循环中提取各项不同数据,代码如上。最后去除第一行废弃数据。

我们继续观察网页源代码,td代表的是一列数据,第一列存储的是报价的时间,第二列是产地,第三列是类别,第四列存储了具体的品种和价格和一些补充信息,第五列则是联系人的方式,我们按照列表的方法把数据提取并写入文件。image-20260116173533189

但是打开文件后我们发现,中间有很多[NBSP]存在,这里表示这里有空格,所以我们还要对price和produce做一个空格置换的处理。image-20260116173652717

对于提取到的第三列第四列数据,把前后非断行的空格符换成空重新写入文档中image-20260116173841090

别忘记关上文档和访问!

from bs4 import BeautifulSoup
import requests
import csvurl = "http://www.shucai123.com/price/"
header = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"
}
f = open("蔬菜网价格.csv", "w", encoding="utf-8", newline="")
csvwriter = csv.writer(f)   # 写入csv文件
resp = requests.get(url, headers=header)page = BeautifulSoup(resp.text, "html.parser")   # 解析网页,html.parser为解析器
table = page.find_all("table", attrs={"class": "bjtbl"})
# print(table)
trs = table[0].find_all("tr")[1:]   # 去掉表头for tr in trs:tds = tr.find_all("td")date = tds[0].text.strip()produce = tds[1].text.strip()kind = tds[2].text.strip()price = tds[3].text.strip().replace('\u00a0', ' ')producer = tds[4].text.strip().replace('\u00a0', ' ')csvwriter.writerow([date, produce, kind, price])
# print(trs)
print("写入成功")
f.close()
resp.close()

摄影中国

(完整代码附在文后)

老规矩先观察源代码image-20260116180453350

我们可以发现图片和连接都被存在li中,这里也有图,但这里的图是缩略图,我们不采用。一个ul则是存储一行的信息,而所有的ul则存储在

中,我可以先提取div下所有的内容,从中直接筛选出li并取到连接,跳过ul标签。image-20260116181306064

这里因为我用的python版本原因,哪怕只读取到一个数据,也必须使用列表[0]的形式

接着我们进入列表循环,从每一个a标签的href中拿到链接,这里使用get方法image-20260116181514487

image-20260116181634881

拿到并访问下一级网址后,我们继续观察网页源代码,使用开发者工具,找到图片在源代码中的位置。发现他在img标签下,我们用属性和属性值做进一步确定,防止提取错误

image-20260116182124594

image-20260116182215835

image-20260116210201139

但是这样只读取到了第一页,那后面几页怎么办呢,我们观察后面的几页的连接

http://photo.china.com.cn/2022-01/28/content_78016858_3.htm

在url后面拼接_page来转页,详细可以看之前豆瓣的方法,用status_code去做验证,但这里我们用另一种办法,我们发现当page为1时页面不存在,接着尝试page为0神奇的事情发生了image-20260116210458788

所有的图片都出现了,那我们可以直接拼接_0然后从中一次提取所有的图片url,别忘记在一次提取结束加上sleepimage-20260116210629692

好了这下我们就获取了所有图片image-20260116210710547

import requests
from bs4 import BeautifulSoup
import time
from urllib.parse import urljoin
url = "http://photo.china.com.cn/foto/node_7185699.htm"
header = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"
}
response = requests.get(url, headers=header)
response.encoding = "utf-8"main_page = BeautifulSoup(response.text, "html.parser")  # 解析网页
alist = main_page.find_all("div", class_="main")
alist1 = alist[0].find_all("li")for a in alist1:# 获取图片链接a_href = a.find("a")href = a_href.get("href")  # 通过get方法获取href属性的值href = href.replace(".htm", "_0.htm")child_page_response = requests.get(href)child_page_response.encoding = "utf-8"child_page = BeautifulSoup(child_page_response.text, "html.parser")img_list = child_page.find_all("img", attrs={'classdata': 'next_page'})# find_all返回的是列表ResultSetfor it in img_list:src = it.get("src")  # 获取图片的src属性值img_resp = requests.get(src)    # 下载图片img_name = src.split("/")[-1]  # 获取图片的名称with open("img/"+img_name, mode="wb")as f:f.write(img_resp.content)print(img_name, "下载完成")print("---------------------------------------------")time.sleep(1)print("over!!")
response.close()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询