赞
踩
本次爬取贝壳找房网二手房信息
所使用的第三方库有:lxml、requests;
先贴上完整代码:
# -*- coding:utf-8 -*- import requests from lxml import etree import re import csv class Spider(object): def __init__(self): self.url = 'https://sz.ke.com/ershoufang/{}/pg{}/' self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' } def response(self, url): response = requests.get(url=url, headers=self.headers) response.encoding = 'utf-8' return response.text def parse(self, response, write): tree = etree.HTML(response) title = tree.xpath('//ul[@class="sellListContent"]//li[@class="clear"]/div[@class="info clear"]/div/a/text()') content = tree.xpath( '//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="houseInfo"]/text()') # 有空值 gzl = tree.xpath( '//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="followInfo"]/text()') # 有空值 x_pr = tree.xpath( '//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="totalPrice"]/span/text()') s_pr = tree.xpath( '//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="unitPrice"]/span/text()') new_content = [] new_gzl = [] for i in range(1, len(content), 2): new_content.append(content[i]) new_gzl.append(gzl[i]) for a, b, c, d, e in zip(title, new_content, new_gzl, x_pr, s_pr): write.writerow([a, re.sub('|\n', '', b), re.sub(' |\n', '', c), d, e]) def crawl(self, url, write): response = self.response(url) items = self.parse(response, write) def main(self): address_list = ['luohuqu', 'futianqu', 'nanshanqu', 'yantianqu', 'baoanqu', 'longgangqu', 'longhuaqu', 'guangmingqu', 'pingshanqu', 'dapengxinqu'] key = ['标题', '详情', '关注量', '总价(万)', '每平方米价格'] for address in address_list: with open('{}.csv'.format(address), 'a', newline='', encoding='utf-8') as fp: write = csv.writer(fp) write.writerow(key) print('现在爬取%s的二手房信息' % address) flag = eval(input("是否继续爬取,继续输入1,跳过该区域的爬取输入0")) if flag == 1: page_max = eval(input("请输入爬取的页数")) for page in range(1, page_max + 1): new_url = self.url.format(address, page) self.crawl(new_url, write) print('第%s页爬取完成' % page) print('已完成%s爬取' % address) print('\n') elif flag == 0: continue if __name__ == '__main__': S = Spider() S.main()
在本次学习的过程中遇到的难点:
1、第一次使用xpath来解析网页,颇有不习惯
2、解析出来的数据有部分不工整需格式化处理
def main(self): address_list = ['luohuqu', 'futianqu', 'nanshanqu', 'yantianqu', 'baoanqu', 'longgangqu', 'longhuaqu', 'guangmingqu', 'pingshanqu', 'dapengxinqu'] key = ['标题', '详情', '关注量', '总价(万)', '每平方米价格'] # 文件首行信息 for address in address_list: with open('{}.csv'.format(address), 'a', newline='', encoding='utf-8') as fp: write = csv.writer(fp) write.writerow(key) # 写入第一行信息 print('现在爬取%s的二手房信息' % address) flag = eval(input("是否继续爬取,继续输入1,跳过该区域的爬取输入0")) # 设置flag来控制程序变化 if flag == 1: page_max = eval(input("请输入爬取的页数")) for page in range(1, page_max + 1): new_url = self.url.format(address, page) # 拼接成新url self.crawl(new_url, write) # 启动爬虫程序 print('第%s页爬取完成' % page) print('已完成%s爬取' % address) print('\n') elif flag == 0: continue
通过观察url发现可变化参数,于是设置了address_list来控制爬取内容的区域、设置了通过输入page_max来指定爬取界面页数,由此拼接成新的url获取信息。
如发现可以改进的地方或者哪里做得不好,希望大家能够提出多多交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。