首先你需要去网页上通过F12识别数据的url,user-agent,以及请求方式(是get还是post)
步骤一:找出数据所在的html文件(可以使用搜索),并从该数据中的headers找信息
- 点击数据所在文件的headers,查看请求类型(get还是post),得到cookie和user-agent
- 如果爬取的数据需要翻页,则观察url的规律,一般是尾部的数字会有所改变,则要根据请求类型进行相应的编码
步骤二:完善创建请求函数
- 如果是get请求,一般翻页规律藏在url中
如果url后面有多个数要串起来,建立一个data并用urlencode串起来,get请求url连结可以直接用加法,但记得一定是str相连,如果不是str格式需要先变换格式
2.如果是post请求,一般在payload里面找
在post请求中,data必须要用urlencode编码,并且request中要加上data=data
步骤三:编写xpath路径
可以在html找到需要的数据,右键获取xpath路径
下面是案例
import urllib.request
import urllib.parse
from lxml import etree
import pandas as pd
def creat_request(page):
#url="https://www.muniao.com/guangzhou/null-0-0-0-0-0-5-0-1.html?tn=mn19091015"
base_url="https://www.muniao.com/guangzhou/null-0-0-0-0-0-5-0-"
url=base_url+str(page)+".html?tn=mn19091015"
headers={
"User-Agent":"你的user-agent" , #在html中header找
"Cookie":"你的cookie"
}
request=urllib.request.Request(url=url,headers=headers)
return request
def get_content(request):
response=urllib.request.urlopen(request)
content=response.read().decode("utf-8")
return content
def down_load(content):
tree=etree.HTML(content)
headers={
"User-Agent":"" , #在html中header找
"Cookie":""
}
url_list=tree.xpath('//div[@class="s_mn_house_tit"]/a/@href')
#name_list =tree.xpath('//ul[@id="Lmain_con"]/li/@data-title')
id_list =tree.xpath('//ul[@id="Lmain_con"]/li/@data-id')
price_list=tree.xpath('//ul[@id="Lmain_con"]/li/@data-price')
x_list =tree.xpath('//ul[@id="Lmain_con"]/li/@data-x')
y_list =tree.xpath('//ul[@id="Lmain_con"]/li/@data-y')
sells_list=tree.xpath("//div[@class='s_mn_house_introduction']/div[@class='near_reserve']/span/text()")
total_data = []
for i in range(len(url_list)):
idd=id_list[i]
price=price_list[i]
x=x_list[i]
y=y_list[i]
sells=sells_list[i]
url=url_list[i]
#获取详情页数据
total_url='https://www.muniao.com'+url
request=urllib.request.Request(url=total_url,headers=headers)
response=urllib.request.urlopen(request)
result=response.read().decode("utf-8")
tree=etree.HTML(result)
name=tree.xpath("//div[@class='room_tt']/h1[@class='room_tth1']/span[@class='room_title']/a/text()")[0].strip("'[]\"")
fangyuan=tree.xpath("//ul[@id='fjxx']/li[1]/div[@class='nrboxq']/span[@class='fcolor7']/text()")[0].strip("'[]\"")
huxing=tree.xpath("//ul[@id='fjxx']/li[2]/div[@class='nrboxq']/span[@class='fcolor7']/text()")[0].strip("'[]\"")
total_data.append({
"名字": name,
"id": str(idd),
"价格": price,
"经度": x,
"维度": y,
"近期预定":sells,
"房源类型":fangyuan,
"户型": huxing,
})
# 直接返回包含所有行的DataFrame
return pd.DataFrame(total_data)
if __name__ =='__main__':
start_page=int(input('起始页'))
end_page=int(input('终止页'))
all_dataframes = []
for page in range(start_page,end_page+1):
request=creat_request(page)
content=get_content(request)
total_data=down_load(content)
data = down_load(content) # 调用修复后的down_load函数
all_dataframes.append(data)#下载