一.项目背景
本次主要是为了巩固之前学,将多个软件/模块连贯起来,做完整案列
二.项目需求
2.1 获取多页数据信息
2.2 下载到本地
三.准备
这个环节主要是针对本次爬取选择合适的获取方式和解析方式
本次选择:requests xpath
本次获取对象:京客隆-店铺分布-店铺信息
四.爬取信息代码操作
4.1 导入模块:需要用的时候再到开头添加模块
import requests #获取方式
from lxml import etree #xpath解析
import pandas as pd #采用pandas方式下载数据
4.2 获取url 和 请求头(反爬),请求头是字典形式
url=' https://www.jkl.com.cn/shop.aspx'
headers={
'User-Agent':'这里放入自己浏览器的链接就行,需要引号'
}
4.3 获取网页内容:得到整个网页信息
response=requests.get(url=url,headers=headers).text
#也可以写2行方便看:
#response=requests.get(url=url,headers=headers)
#content=response.text
结果预览:
4.4解析网页:
4.4.1 解析每个区的短链接
path=etree.HTML(response) #返回结果:<Element html at 0x1db91116f80>
areas=path.xpath('//div[@class="infoLis"]//@href')
需要获取的:
返回结果:
4.4.2 获取每个区的长链接
观察:朝阳区
规律:https://www.jkl.com.cn/ +areas
代码:
#i代表每一个区,将每个区的短链接遍历出来,拼接成完整链接
for i in areas:
url2='https://www.jkl.com.cn/'+i
#获取每一页的详情:这里得出是每个区的整体网页
response1=requests.get(url=url2,headers=headers).text
#解析每个区里具体的信息内容
path1=etree.HTML(response1)
店铺名称=path1.xpath('//span[@class="con01"]/text()')
经营地址=path1.xpath('//span[@class="con02"]/text()')
电话=path1.xpath('//span[@class="con03"]/text()')
营业时间=path1.xpath('//span[@class="con04"]/text()')
获取信息网页观察:
五.下载到本地
采用的pandas写入,请导入panda模块
运行代码后,D盘就会有文件了
数据=pd.DataFrame({"店名":店铺名称,"地址":经营地址,"电话":电话,"营业时间":营业时间})
数据.to_csv('D:/shop3.csv',index=False,header=0,mode='a',encoding='utf_8_sig')
六.本次报错及问题汇总
1.UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character
报错行如下:
正确解法:encoding="utf_8_sig"
尝试过的解法(均不可):
1.修改文件名为中文:依旧报错
2.删掉encoding:不报错,但是乱码
3.encoding="uft-8":不报错,但是乱码
4.encoding="gbk":不报错,但是乱码
2.headers=0 设置问题
还没有找到只存有一个表头的方法,预计只能通过后续的数据清洗来进行
未设置:获取的每一页数据均有表头
设置后:无表头
ps:xpath解析找路径真的很有意思