文章目录
前言
本文为数据采集和分析的综合练习,仅供学习参考,勿作他用!首先来看一下数据需求:
1、进入到住宅用房拍卖页面,以杭州市数据为例;
2、需要将发布的所有杭州市法拍房的信息整理至 EXCEL 表格中;
3、部分需求字段在页面中的位置:
事不宜迟,开工!
一、爬虫篇
1、查询页
1.1、分析网页结构
通过观察可以发现,每页 40 条记录,最大 150 页,也就是说从基本页最多只能获取到 6000 条记录,而杭州市记录总量有 2 万余条。
但杭州市各区的数据都不超过 6000 条,因此我们可以分区爬取数据。
接着,在开发者模式下不难找到所需数据的出处。
我们只需要修改请求连接中的 page 值就可以实现翻页爬取。
1.2、请求与解析
下面开始编写请求代码,很轻松就能获取到查询页的响应内容。
def search_response(p): # 爬取查询到的一页数据
url = f'https://sf.taobao.com/item_list.htm?spm=a213w.7398504.filter.50.70c67db6iX3uXM&location_code=330103&category=50025969&auction_source=0&city=&province=&st_param=-1&auction_start_seg=-1&page={
p}'
headers = {
'cookie': cookie,
'user-agent': "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
}
res = requests.get(url, headers=headers)
return res.text
根据网页源码分析,已知查询页的数据是嵌套的 json 列表,储存在 id="sf-item-list-data"
的 script 标签中,笔者采用美丽汤(beautifulsoup)进行解析,该解析器对 HTML 页面相性优异,如果不熟悉万能的正则表达式,推荐尝试。
def analyze(response): # 解析查询页
soup = BeautifulSoup(response, "html.parser")
script_data = soup.find('script', {
'id': 'sf-item-list-data'}).get_text()
json_data = json.loads(script_data)
json_dic_lst = json_data['data']
total = pd.DataFrame()
for dic in json_dic_lst:
df = pd.DataFrame({
'id': [dic['id']],
'itemUrl': [dic['itemUrl']],
'title': [dic['title']],
})
total = total.append(df)
return total
最终将各区查询页汇总整理如下,id 为每条房产记录的识别号,用于在最后连接查询页与详情页。
2、详情页
2.1、关于反爬
详情页(初步的)请求头参数也比较简单,请求地址即是查询页中的 itemUrl
,从中可以截取出 track_id 参数。但详情页的反爬比较强烈,笔者采用多 user-agent 与 cookie 的方式来尝试规避,效果仍不够理想,且 cookie 池需要多个账号,之后又增加了代理 IP 池。
ua_lst = ["Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0",
"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
"Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
]
cookie_lst = [cookie_1, cookie_2, cookie_3, ...]
headers = {
'cookie': random.choice(cookie_lst ),
'user-agent': random.choice(ua_lst ),
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'referer': 'https://sf.taobao.com/item_list.htm?spm=a213w.7398504.filter.49.62a854b3DbBPQy&location_code=330102&category=50025969&auction_source=0&city=&province=&st_param=-1&auction_start_seg=-1',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q