爬取安居客指定市的所有小区信息

在爬取的过程中发现,访问频率太快会导致网站弹出滑动验证,所以设定了时间随机时间延迟,这样子就能保证爬取的信息完整,我选的是青岛市的小区,后续也可以添加输入市名爬取相关内容,二级页面的房子的平均价格是动态生成的,需要发送一个请求得到一个json,请求的url比较复杂,而且还要再发送一次请求,因此直接在一级页面取平均价格,然后传入解析二级页面的函数,这样可以提高效率.代码如下:

"""
    爬取安居客所有小区信息
"""
import requests
from fake_useragent import UserAgent
from lxml import etree
import csv
import re
import time
import random

class AnjukeSpider(object):
    def __init__(self):
        self.url = ‘https://qd.anjuke.com/community/p{}/‘

    def get_headers(self):
        """
            构建请求头
        :return:
        """
        ua = UserAgent()
        headers = {
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "zh-CN,zh;q=0.9",
            "cache-control": "max-age=0",
            "cookie": "aQQ_ajkguid=534DDCC9-5DBA-263A-CF4D-SX0716083828; isp=true; 58tj_uuid=e559fdad-fdb9-4a73-8c60-9e6e3bf82987; Hm_lvt_c5899c8768ebee272710c9c5f365a6d8=1563237510; als=0; _ga=GA1.2.1881437242.1569052175; ctid=30; wmda_uuid=edd62dcc1e73bddc16beeb56087fd1f8; wmda_new_uuid=1; wmda_visited_projects=%3B6289197098934; sessid=F6826357-F68F-1E17-B5A1-99FEA17341CA; lps=http%3A%2F%2Fwww.anjuke.com%2F%7Chttps%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DcuNIKoO-jX3CGzD7komT_lY2umPIHgZjjBdMMdFnpZHirHVPOLorVTafN32HS5R_%26ck%3D7150.2.84.414.190.439.289.917%26shh%3Dwww.baidu.com%26sht%3D02003390_42_hao_pg%26wd%3D%26eqid%3Dc2951ba5003c81ad000000065d881f86; twe=2; wmda_session_id_6289197098934=1569202063874-b62b0050-2be7-3851; _gid=GA1.2.388348263.1569202065; init_refer=https%253A%252F%252Fwww.baidu.com%252Flink%253Furl%253DcuNIKoO-jX3CGzD7komT_lY2umPIHgZjjBdMMdFnpZHirHVPOLorVTafN32HS5R_%2526ck%253D7150.2.84.414.190.439.289.917%2526shh%253Dwww.baidu.com%2526sht%253D02003390_42_hao_pg%2526wd%253D%2526eqid%253Dc2951ba5003c81ad000000065d881f86; new_uv=3; new_session=0",
            "referer": "https://qd.anjuke.com/community/?from=navigation",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "none",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": ua.random
        }
        return headers

    def get_link(self, url):
        """
            解析页面获取每个小区的二级页面链接和价格
        :param url:
        :return:
        """
        text = requests.get(url=url, headers=self.get_headers()).text
        html = etree.HTML(text)
        link = html.xpath("//h3/a/@href")
        price = html.xpath(‘//*[@id="list-content"]/div/div[2]/p[1]/strong/text()‘)
        print(link)
        print(price)
        for i in zip(link, price):
            print(i)
        return zip(link, price)

    def parse_message(self, url, price):
        """
            二级页面解析需要的信息
        :param url:
        :param price:
        :return:
        """
        dict_result = {‘小区‘: ‘-‘, ‘地址‘: ‘-‘, ‘价格‘: ‘-‘, ‘物业类型:‘: ‘-‘, ‘物业费:‘: ‘-‘, ‘总建面积:‘: ‘-‘, ‘总户数:‘: ‘-‘,
                       ‘建造年代:‘: ‘-‘,
                       ‘停车位:‘: ‘-‘,
                       ‘容积率:‘: ‘-‘,
                       ‘绿化率:‘: ‘-‘,
                       ‘开发商:‘: ‘-‘, ‘物业公司:‘: ‘-‘, ‘所属商圈:‘: ‘-‘, ‘二手房房源数:‘: ‘-‘, ‘租房源数:‘: ‘-‘, ‘相关学校:‘: ‘-‘}

        text = requests.get(url=url, headers=self.get_headers()).text
        html = etree.HTML(text)
        table1 = html.xpath(‘/html/body/div[2]/div[3]/div[1]/h1//text()‘)  # 提取小区名和地址
        table1 = list(map(lambda item: re.sub(‘\s+‘, ‘‘, item), table1))  # 去掉换行符制表符
        table1 = list(filter(None, table1))  # 去掉上一步产生的空元素
        dict_result[‘小区‘] = table1[0]
        dict_result[‘地址‘] = table1[1]
        dict_result[‘价格‘] = price
        table2 = html.xpath(‘//*[@id="basic-infos-box"]/dl//text()‘)
        table2 = list(map(lambda item: re.sub(‘\s+‘, ‘‘, item), table2))
        table2 = list(filter(None, table2))
        table2_list1 = table2[::2]
        table2_list2 = table2[1::2]
        table2_list3 = zip(table2_list1, table2_list2)
        for j in table2_list3:
            dict_result[j[0]] = j[1]
        # price = html.xpath(‘//*[@id="basic-infos-box"]/div[1]/span[1]/text()‘)  #价格数据在json文件里面,所以这个没办法匹配到
        # dict_result[‘价格‘] = price[0]
        table3 = html.xpath(‘//*[@id="basic-infos-box"]/div[2]//text()‘)
        table3 = list(map(lambda item: re.sub(‘\s+‘, ‘‘, item), table3))
        table3 = list(filter(None, table3))
        table3_list1 = table3[::2]
        table3_list2 = table3[1::2]
        table3_list3 = zip(table3_list1, table3_list2)
        for j in table3_list3:
            dict_result[j[0]] = j[1]
        print(dict_result)
        return dict_result

    def save_csv(self, result):
        """
            将信息保存进入csv文件
        :param result:
        :return:
        """
        headers = {‘小区‘, ‘地址‘, ‘价格‘, ‘物业类型:‘, ‘物业费:‘, ‘总建面积:‘, ‘总户数:‘,
                   ‘建造年代:‘,
                   ‘停车位:‘,
                   ‘容积率:‘,
                   ‘绿化率:‘,
                   ‘开发商:‘, ‘物业公司:‘, ‘所属商圈:‘, ‘二手房房源数:‘, ‘租房源数:‘, ‘相关学校:‘}
        with open(‘青岛.csv‘, ‘a‘, newline=‘‘) as f:
            writer = csv.DictWriter(f, headers)
            # writer.writeheader()
            for row in result:
                writer.writerow(row)

    def run(self):
        """
            主函数
        :return:
        """
        C = 1
        for i in range(1, 101):  # 总的272页
            url = self.url.format(i)
            link = self.get_link(url)
            list_result = []
            for j in link:
                try:
                    result = self.parse_message(j[0], j[1])
                    time.sleep(round(random.randint(1, 3), C))
                    list_result.append(result)
                except Exception as err:
                    print(err)
            self.save_csv(list_result)
            print("第%s页储存成功" % i)

        # url = ‘https://qd.anjuke.com/community/view/875393?from=Filter_1&hfilter=filterlist‘
        # self.parse_message(url)
        # self.get_link()

if __name__ == ‘__main__‘:
    spider = AnjukeSpider()
    spider.run()

原文地址:https://www.cnblogs.com/lattesea/p/11577447.html

时间: 2024-10-16 08:03:41

爬取安居客指定市的所有小区信息的相关文章

【scrapy实践】_爬取安居客_广州_新楼盘数据

需求:爬取[安居客-广州-新楼盘]的数据,具体到每个楼盘的详情页的若干字段. 难点:楼盘类型各式各样:住宅 别墅 商住 商铺 写字楼,不同楼盘字段的名称不一样.然后同一种类型,比如住宅,又分为不同的情况,比如分为期房在售,现房在售,待售,尾盘.其他类型也有类似情况.所以字段不能设置固定住. 解决方案:目前想到的解决方案,第一种:scrapy中items.py中不设置字段,spider中爬的时候自动识别字段(也就是有啥字段就保留下来),然后返回字典存起来.第二种,不同字段的网页分别写规则单独抓取.

python爬取安居客二手房网站数据(转)

之前没课的时候写过安居客的爬虫,但那也是小打小闹,那这次呢, 还是小打小闹 哈哈,现在开始正式进行爬虫书写 首先,需要分析一下要爬取的网站的结构: 作为一名河南的学生,那就看看郑州的二手房信息吧! 在上面这个页面中,我们可以看到一条条的房源信息,从中我们发现了什么,发现了连郑州的二手房都是这么的贵,作为即将毕业的学生狗惹不起啊惹不起 还是正文吧!!! 由上可以看到网页一条条的房源信息,点击进去后就会发现: 房源的详细信息. OK!那么我们要干嘛呢,就是把郑州这个地区的二手房房源信息都能拿到手,可

python3 爬虫之爬取安居客二手房资讯(多线程版)

第一步先分析网站结构http://esf.zs.fang.com/ 寻找我们需要获取的信息,点击进去看看, 链接里面信息更加详细,这些就是我们要获取的. 1.我们可以先获取http://esf.zs.fang.com/链接下的所有详细链接http://esf.zs.fang.com/chushou/3_255784229.htm 2.然后可以在详细链接下分析获取我们所需要的数据 3.获取数据之后存取到数据库mongodb 打开管理员工具F12观察http://esf.zs.fang.com/的详

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

java爬虫爬取博客园数据

网络爬虫 编辑 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler).聚焦网络爬虫(Focused Web Crawler).增量式网络爬虫(Incremental Web Crawler).深层网络爬虫(Deep We

项目实战!我用Python爬取了14年所有的福彩3D信息

前两天,在网上看到一个有意思的问题:×××靠谱么?为什么还有那么多的人相信×××? 暂且不说,×××是否靠谱?×××也分人而异,江湖上骗术很多,有些甚至会误以为×××的准确度可以很高,这些操盘手法,让不知原理的彩民心甘情愿地掏钱买料. 在×××上,也有正儿八经去研究"规律" 的,不外乎三个"派别":数据派.图形派.公式派.还有一派不列入:字谜字画派,可纳入蛇精病行列. 究竟哪一派预测的靠谱准确呢?不懂,因为我几乎不买×××(买也是玩玩,娱乐娱乐),也不去研究.但不管

python爬虫:爬取链家深圳全部二手房的详细信息

1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构: class LianjiaSpider(object): def __init__(self): def getMaxPage(self, url): # 获取maxPage def parsePage(self, url): # 解析每个page,获取每个huose的Link def pars

Python - 爬取博客园某一目录下的随笔 - 保存为docx

1 #coding:utf-8 2 import requests 3 from bs4 import BeautifulSoup 4 import MySQLdb 5 6 7 def get_html(url): 8 ''' 9 获取页面HTML源码,并返回 10 ''' 11 html = requests.get(url) 12 content = html.text.encode('utf-8') 13 return content 14 15 def get_blog_html_lis

webmagic爬取博客园所有文章

最近学习了下webmagic,学webmagic是因为想折腾下爬虫,但是自己学java的,又不想太费功夫,所以webmagic是比较好的选择了. 写了几个demo,源码流程大致看了一遍.想着把博客园的文章列表爬下来吧. 首页显示的就是第一页文章的列表, 但是翻页按钮不是链接,而是动态的地址: 实际请求的地址及参数: 针对这个动态页面的情况,有两种解决方案: 1. webmagic模拟post请求,获取返回页面. 1 public class CnblogsSpider implements Pa