***声明:***纯粹是用于学习
1.网页重定向
分析房天下网站,每个网页有个重定向
如:访问https://cd.esf.fang.com/chushou/3_211293494.htm会跳转至https://cd.esf.fang.com/chushou/3_211293494.htm?rfss=1-b71f212cbb874a451c-3a
解决方法:在原网页源代码中找到重定向网址,request 新网址即可
response=requests.get(url,headers = headers)
html=response.text
#网页重定向
pat=re.compile(r'点击跳转')
url=re.findall(pat,html)[0]
response=requests.get(url,headers = headers)
return response.text
2.bs4获取标签内容,部分代码
temp_dict['房源']=soup.find('title').string
temp_dict['小区'] = soup.find('div',id="xq_message").get_text()
temp_dict['总价']=soup.find('div',class_="tab-cont-right").find('div',class_="trl-item price_esf sty1").get_text()
3.将数据保存在csv文件中
def save_data_csv(keyword_list,dict_data):
if not os.path.exists('fang.csv'):
with open('fang.csv', "w", newline='', encoding='utf-8') as csvfile: # newline='' 去除空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list) # 写字典的方法
writer.writeheader() # 写表头的方法
# 接下来追加写入内容
with open('fang.csv', "a", newline='', encoding='utf-8') as csvfile: # newline='' 一定要写,否则写入数据有空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list)
writer.writerow(dict_data) # 按行写入数据
print("^_^ write success")
4.完整代码
import re,requests,time,os
from bs4 import BeautifulSoup
from lxml import etree
import json
import csv
def get_html(url):
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
'cookie':'city=cd; __utma=147393320.989730142.1589024416.1589024416.1589024416.1; __utmc=147393320; __utmz=147393320.1589024416.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmt_t0=1; __utmt_t1=1; __utmt_t2=1; global_cookie=9ekumblkqetgf7unt5iefiegk1nk9zk41by; logGuid=08b2183e-66fd-4851-8c49-20b9c55f4562; Integrateactivity=notincludemc; csrfToken=ZEhmg2XlXN8rivcJcEqBk4FO; budgetLayer=1%7Ccd%7C2020-05-09%2019%3A41%3A50; g_sourcepage=esf_fy%5Exq_pc; lastscanpage=0; __utmb=147393320.15.10.1589024416; unique_cookie=U_9ekumblkqetgf7unt5iefiegk1nk9zk41by*4',
'authority': 'cd.esf.fang.com',
'path': '/staticsearchlist/EsfListAjax/GetAIDaoGou?pagesize=5',
}
response=requests.get(url,headers = headers)
html=response.text
#网页重定向
pat=re.compile(r'点击跳转')
url=re.findall(pat,html)[0]
response=requests.get(url,headers = headers)
return response.text
#print(html)
def get_fang_url(html):
soup = etree.HTML(html)
urls = soup.xpath('//dd/h4[@class="clearfix"]/a/@href')
return urls
def save_data_csv(keyword_list,dict_data):
if not os.path.exists('fang.csv'):
with open('fang.csv', "w", newline='', encoding='utf-8') as csvfile: # newline='' 去除空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list) # 写字典的方法
writer.writeheader() # 写表头的方法
# 接下来追加写入内容
with open('fang.csv', "a", newline='', encoding='utf-8') as csvfile: # newline='' 一定要写,否则写入数据有空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list)
writer.writerow(dict_data) # 按行写入数据
print("^_^ write success")
def parse_page(url,html):
#去除网页html里面的换行,以便更好的获取数据
html = "".join(line.strip() for line in html.split("\n"))
#定义一个字典
temp_dict={}
soup=BeautifulSoup(html,'lxml')
#采集房源信息
temp_dict['房源']=soup.find('title').string
temp_dict['小区'] = soup.find('div',id="xq_message").get_text()
temp_dict['总价']=soup.find('div',class_="tab-cont-right").find('div',class_="trl-item price_esf sty1").get_text()
temp_dict['户型']=soup.find('div',class_="trl-item1 w146").find('div',class_="tt").get_text()
temp_dict['建筑面积'] = soup.find('div', class_="trl-item1 w182").find('div', class_="tt").get_text()
temp_dict['单价'] = soup.find('div', class_="trl-item1 w132").find('div', class_="tt").get_text()
temp_dict['详情页'] = url
temp_dict['经纪人'] = soup.find('a',id="kesfsfbxq_A01_03_03").get_text()
print(temp_dict)
keyword_list=['房源','小区','总价','户型','建筑面积','单价','详情页','经纪人']
save_data_csv(keyword_list,temp_dict)
#主函数
if __name__ == '__main__':
#构造网址序列
urls=['https://cd.esf.fang.com/house-a016749-b014906/i{}'.format(i) for i in range(1,101)]
for url in urls:
#获取单页数据
html = get_html(url)
#获取单页上房源的链接
new_urls = get_fang_url(html)
for url in new_urls:
new_url = 'https://cd.esf.fang.com' + url
#打印网址
print(new_url)
#获取HTML
html = get_html(new_url)
#解析网页,保存数据
parse_page(new_url,html)
#防止被禁IP,每访问完一页,睡眠5秒
time.sleep(5)