在爬取页面时,我们时常会遇到状态码不为202的页面,我们在遇到反爬时一般会有以下几种方法进行应对。
1、加User-Agent验证(代理网络用户取得网络信息)
2、加代理
3、验证码(图像识别或借助第三方打码平台)
4、selenium(动态加载)
5、换平台
接下来我们将讲解当网页状态码为302时,如何对网页进行爬取
--以klook网站日本旅游网页爬取为例
url='https://www.klook.com/zh-CN/search?type=country&query=%E6%97%A5%E6%9C%AC'
#导入包
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
url='https://www.klook.com/zh-CN/search?type=country&query=%E6%97%A5%E6%9C%AC'
r = requests.get(url)
soup = BeautifulSoup(r.text,'lxml')
urls = soup.find('div',class_='act_list').find_all('a')
#获取所有网址
url_lst = []
for url in urls:
url_lst.append(url['href'])
url_lst
#为每个网址添加前缀'https://www.klook.com’
for n in range(0,len(url_lst)):
url_lst[n]='https://www.klook.com'+url_lst[n]
print(url_lst)
点开网页,按F12查看元素,获取headers添加到requests.get里
def datacrawler(urli):
headers = {#自行添加
}
ri = requests.get(url=urli,headers=headers)
soupi = BeautifulSoup(ri.text,'lxml')
title = soupi.find('h1',class_='t32').text
info1 = soupi.find('ul',class_='act_icons t14').text
info1 = re.split('[\n]',info1)
for item in info1[:]:
if item == '':
info1.remove(item)
info2 = soupi.find('strong',class_='t24').text
info2 = re.split('[\n]',info2)
for item in info2[:]:
if item == '':
info2.remove(item)
info3 = soupi.find('div',class_='left_box').text
info3 = re.split('[\n]',info3)
for item in info3[:]:
if item == '':
info3.remove(item)
info4 = soupi.find('span',class_='j_goto_review star_box').text
info4 = re.split('[\n]',info4)
for item in info4[:]:
if item == '':
info4.remove(item)
dic={'票名':title,'注意事项':info1,'价格':info2,'参加人数':info3,'评分情况':info4}
return dic
data = []
n = 0
for u in url_lst:
print('采集网页',u)
n+=1
data.append(datacrawler(u))
print('采集网页成功,总采集%i条网址/n'%n)
接下来将数据转存为文件,引入pandas包
import pandas as pd
tb = pd.DataFrame(data)
tb.to_excel('D:/日本klook网页爬取.xlsx',encoding='utf-8')
df = pd.read_excel('D:/日本klook网页爬取.xlsx')
对数据进行一定程度的清洗和处理,包括分列和删除无效字符
df['价格1']=df['价格'].str.split('¥').str[1]
df['评分']=df['评分情况'].str.split(',').str[0]
df['评价数目']=df['评分情况'].str.split('条').str[0]
以上就是此次爬取流程,属于基础爬虫,针对302页面,主要是加headers条件。
今日激励:Our integrity sells for so little, but it is all we really have.
尊严不值钱,却是我们仅有的。