文章目录
前言
看看生猪价格,确定后面饭桌的菜肴。。。话不多说,练习开始。。。
正文
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 获取的信息有时不在看到的位置,需要注意观察网页变化情况,如台湾省的数据链接。