一、选择一个网站,观察需要的内容位置
这次练手对象是一个2345网站天气数据,如下:
这里面我想要获得的天气数据如上图,我需要将这些数据爬取下来并保存为本地文件。
二、查看代码,观察内容信息在代码中所处的位置
右键,选择查看源代码,复制网站显示内容直接在源代码里面查询,快速定位;
由上图看,定位的位置在td标签里面,在仔细看一下,不难发现我所需要的信息在ul和table标签下面,位置确定后就可以使用BeautSoup进行解析了。
三、使用requests和BeautifulSoup进行分析整理
1、利用requests对网站进行访问,获得响应
headers = {自己的headers}
response = requests.get(url, headers=headers)#headers最好弄上,大部分网站都有反爬虫机制,有这个进行模拟人登录,不会被网站拦截
response.encoding=response.apparent_encoding
print(response.status_code)
return response.text
这个headers最好一块写上去,防止网站拦截,至于这个headers怎么获得,可以直接在网站右键,选择检查,如下:
这个动作就有点那种抓包的意思了,后面处理爬取动态网站的时候可能会用到;注意响应的编码,是不是真正的正确访问网站了。
2、结合前面确定的内容位置,利用BeautifSoup来定位分析
我们可以利用class这个属性来获取内容
listrow = []#获取开头那个月度总结,但是不太好随日期一起写入文件,所以只是提取,后并未做处理
list1=[]#从这往下的几个定义的列表,都是相当于中转,最终只要listall3
listall=[]
listall1=[]
listall2=[]
listall3=[]
html=BeautifulSoup(demo,'html.parser')#对标签进行格式整理
l1=html.find_all(attrs={'class':'history-msg'})#所有需要的内容都在这个标签下面
for i in l1:
listrow.append(i.text)#获取文本内容,去掉标签
list1=html.find_all(attrs={'class':'history-table'})#单纯具体日期明细在这个标签下面
for i in list1:
listall.append(i.text)#同上,获取文本,去掉标签
listall1=listall[0].replace(" ","").split("\n")#从这开始到后面,都是对提取的内容进行整理美化
print(listrow)
for i in range(len(listall1)):
if len(listall1[i])!=0:
listall2.append(listall1[i])
for i in range(int(len(listall2)/6)):#6个一行进行分行
listall3.append(listall2[6*i:(6*(i+1)-1)])
提取到内容后,剩下的就是对内容进行格式方面的整理了,不作赘述
四、数据保存
数据啥的都处理好之后,看自己个人需求,要不要保存,保存到哪种格式文件下,我这里是保存到CSV表格中,借用pandas来处理:
tr=pd.DataFrame(listall3)#这开始就是保存到本地文件中,也可以借用open函数进行保存
tr.to_csv("C:\\Users\\YEER\\Desktop\\allin3.csv")
然后输出完成,但是在输出到文件后,我发现他自带序号和列名,但是这个to_csv函数我也看了具体用法,设置列名的时候经常报错,我一时也没啥好办法,也就不管他了,也不影响我自己看和在文件中处理【笑哭】
最后,我发现那个天气时间是可以选择的,所以我想试着能不能实现爬取我需要的某年某月的天气,而且很明显能发现,之前的具体天气在上面的源代码里面是找不到的,所以需要我去学习一下爬取动态网站的知识了。
大概下午或者明天的时候,我把动态的爬取过程发过来,已做记录。
最后最后,附上完整代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd
def geturl(url):#这个函数就是获取网站的整个内容,如果后面需要频繁访问网站的话,可以直接调用这个函数,如果只是访问一次,就没必要定义这个函数,可以直接撸代码
headers = {"自己的header"}
response = requests.get(url, headers=headers)#headers最好弄上,大部分网站都有反爬虫机制,有这个进行模拟人登录,不会被网站拦截
response.encoding=response.apparent_encoding
print(response.status_code)
return response.text
#玩爬虫的时候,如果要频繁访问某个网站的话,最好设置等待或休息时间,一方面有利于网站内容加载,一方面对网站友好,加油,做一个优秀友好的爬虫人!
def gettxt(demo):
listrow = []#获取开头那个月度总结,但是不太好随日期一起写入文件,所以只是提取,后并未做处理
list1=[]#从这往下的几个定义的列表,都是相当于中转,最终只要listall3
listall=[]
listall1=[]
listall2=[]
listall3=[]
html=BeautifulSoup(demo,'html.parser')#对标签进行格式整理
l1=html.find_all(attrs={'class':'history-msg'})#总的天气概况在这个下面
for i in l1:
listrow.append(i.text)#获取文本内容,去掉标签,这个就是月度总天气概况,但是后面发现不太容易一块写入文件,所以只是爬取,后续未做处理
list1=html.find_all(attrs={'class':'history-table'})#单纯具体日期明细在这个标签下面
for i in list1:
listall.append(i.text)#同上,获取文本,去掉标签
listall1=listall[0].replace(" ","").split("\n")#从这开始到后面,都是对提取的内容进行整理美化
print(listrow)
for i in range(len(listall1)):
if len(listall1[i])!=0:
listall2.append(listall1[i])
for i in range(int(len(listall2)/6)):#6个一行进行分行
listall3.append(listall2[6*i:(6*(i+1)-1)])
tr=pd.DataFrame(listall3)#这开始就是保存到本地文件中,也可以借用with-open格式进行保存
tr.to_csv("自己的保存的文件地址")
def main():
url="https://tianqi.2345.com/wea_history/58238.htm"
r=geturl(url)
gettxt(r)
main()
标签:headers,python,标签,爬取,网站,listall1,html,response
From: https://blog.csdn.net/ldjdjdk/article/details/143872918