【爬虫练习】看生猪价格O(∩_∩)O哈哈~

本文介绍了一个使用Python的基本爬虫实践案例,通过requests和BeautifulSoup库抓取生猪价格信息。文章详细展示了如何分析网页结构,构造获取省份、城市及具体信息的函数,以及如何处理和保存数据。
摘要由CSDN通过智能技术生成

前言

看看生猪价格,确定后面饭桌的菜肴。。。话不多说,练习开始。。。

正文

1、分析网页

如图,从网页结构看,数据是分省份,城市地区的,爬虫如果要做到获取不同省份,不同城市地区的完整信息,先要做一次筛选,获取各省份,各城市地区的链接
在这里插入图片描述
筛选后的网页:
在这里插入图片描述
最终信息所在的页面显示,这里就是想要获取的信息:
在这里插入图片描述

2、开始编写代码

代码方式还是采取最基本的requests+bs4方法(小菜鸟就只会这个 ̄□ ̄||)
import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
import time

2.1 基本信息获取

2.1.1构造主页信息函数:
def get_datas(url,headers):
	html = requests.get(url,headers = headers)
	soup = BeautifulSoup(html.text,'lxml')
	datas = soup.select('.wrapper a')
	return datas
2.1.2 构造获取省份、城市地区的信息函数:

这里取信息时做了偷懒,直接数30个省市所在的位置了,这里台湾省的标签不在这里,这网站有点坑,怎么取,往下看,注意要补全网址。

def get_province(datas):
	dic = {}
	province_ls = []
	province_url_ls = []
	for i in range(56,86):
		dic[datas[i].text] = 'https://bj.zhue.com.cn/'+datas[i]['href']	
	return dic

台湾省的获取在这里,上述30个省份,随便选一个后,这里可以获取到台湾省的链接,需要单独获取。

def get_city(url,headers):
	datas = get_datas(url,headers) 
	taiwan_dic = {} 
	dic = {}
	city_ls = []
	city_url_ls = []
	taiwan_dic['台湾'] = datas[86]['href']

	for i in range(len(datas)):
		try:
			a = datas[i]['href']
			r1 = re.match('^list.*?city.*?html',a)
			url = 'https://bj.zhue.com.cn/'+r1.group()
			city_url_ls.append(url)

		except:
			pass

	for j in range(86,86+len(city_url_ls)+1):	
		city_ls.append(datas[j].text)

	for n in range(len(city_url_ls)):
		city = city_ls[n+1]   #这里不加1,会把台湾省放进来
		city_url = city_url_ls[n]
		dic[city] = city_url
	
	return dic,taiwan_dic
2.1.3 获取底层网页信息

这里主要是用正则表达式筛选,然后补全网址。

def get_each_url(url,headers):
	datas = get_datas(url,headers)
	ls = []
	n=1
	for i in range(len(datas)):
		try:
			n+=1
			data = datas[i]['href']
			r1 = re.match('^view-.*?html',data)
			url = 'https://bj.zhue.com.cn/'+r1.group()
			ls.append(url)
		except:
			pass
	return ls
2.1.4 获取信息

用split做数据处理后,可以直接拿到数据

def get_messages(url,headers):
	dic = {}
	html = requests.get(url,headers = headers)
	soup = BeautifulSoup(html.text,'lxml')
	datas = soup.select('.xinxi_con .tbpara')
	datas = datas[0].text.split()

	dic['发布日期'] = datas[1]
	dic['报价地点'] = datas[3] + datas[4] + datas[5]
	dic['产品名称'] = datas[7]
	dic['产品类别'] = datas[9]
	dic['价格'] = datas[11]
	dic['ip地址'] = datas[17]

	return dic

2.2 主函数

代码运行有重复值,目前没找到在哪,坑_(:з」∠)_,数据均为做后续处理,ip值有些会位数不对。。。

if __name__ == '__main__':
	url = 'https://bj.zhue.com.cn/'
	headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
	datas = get_datas(url,headers)
	province_url = get_province(datas)

	taiwan_dic = get_city(province_url['北京市'],headers)[1]
	province_url['台湾'] = taiwan_dic['台湾']

	# #例:获取广西南宁地区的猪价
	search_province_url = province_url['广西']
	city_url = get_city(search_province_url,headers)[0]['南宁市']

	each_ls = get_each_url(city_url,headers)[:20]
	all_ls = []
	n = 1
	m = 1
	for url in each_ls:
		print(url)
		try:
			dic = get_messages(url,headers)
			print(f'获取第{n}条数据')
			n+=1
			all_ls.append(dic)
			time.sleep(1)
		except:
			print(f'第{m}条错误网址,网址为:{url}')
			m+=1
	df = pd.DataFrame(all_ls)
	df.to_csv('未处理的数据.csv',encoding = 'gbk')

3、总结

3.1 此次代码要点主要是分析网页结构,确认需要获取的数据怎么来的,如代码的写法,需要不断的取打印检查,此方法比较耗时。
3.2 获取的信息有时不在看到的位置,需要注意观察网页变化情况,如台湾省的数据链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值