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

需求:爬取【安居客—广州—新楼盘】的数据,具体到每个楼盘的详情页的若干字段。

难点:楼盘类型各式各样:住宅 别墅 商住 商铺 写字楼,不同楼盘字段的名称不一样。然后同一种类型,比如住宅,又分为不同的情况,比如分为期房在售,现房在售,待售,尾盘。其他类型也有类似情况。所以字段不能设置固定住。

解决方案:目前想到的解决方案,第一种:scrapy中items.py中不设置字段,spider中爬的时候自动识别字段(也就是有啥字段就保留下来),然后返回字典存起来。第二种,不同字段的网页分别写规则单独抓取。显然不可取。我采用的是第一种方案。还有其他方案的朋友们,欢迎交流哈。

目标网址为:http://gz.fang.anjuke.com/ 该网页下的楼盘数据

示例楼盘网址:http://gz.fang.anjuke.com/loupan/canshu-298205.html?from=loupan_tab

开始编写scrapy脚本。建立工程步骤略过。

1、count.py

 1 __author__ = ‘Oscar_Yang‘
 2 #-*- coding= utf-8 -*-
 3 """
 4     查看mongodb存储状况的脚本count.py
 5 """
 6 import time
 7 import pymongo
 8 client = pymongo.MongoClient("localhost", 27017)
 9 db = client["SCRAPY_anjuke_gz"]
10 sheet = db["anjuke_doc1"]
11
12 while True:
13     print(sheet.find().count())
14     print("____________________________________")
15     time.sleep(3)
1 """
2     entrypoint.py
3 """
4 from scrapy.cmdline import execute
5 execute([‘scrapy‘, ‘crawl‘, ‘anjuke_gz‘])
 1 # -*- coding: utf-8 -*-
 2 """
 3     settings.py
 4 """
 5
 6 # Scrapy settings for anjuke_gz project
 7 #
 8 # For simplicity, this file contains only settings considered important or
 9 # commonly used. You can find more settings consulting the documentation:
10 #
11 #     http://doc.scrapy.org/en/latest/topics/settings.html
12 #     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
13 #     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
14
15 BOT_NAME = ‘anjuke_gz‘
16
17 SPIDER_MODULES = [‘anjuke_gz.spiders‘]
18 NEWSPIDER_MODULE = ‘anjuke_gz.spiders‘
19 MONGODB_HOST = "127.0.0.1"
20 MONGODB_PORT = 27017
21 MONGODB_DBNAME="SCRAPY_anjuke_gz"
22 MONGODB_DOCNAME="anjuke_doc1"
23
24 # Crawl responsibly by identifying yourself (and your website) on the user-agent
25 #USER_AGENT = ‘anjuke_gz (+http://www.yourdomain.com)‘
26
27 # Obey robots.txt rules
28 ROBOTSTXT_OBEY = False
29
30 # Configure maximum concurrent requests performed by Scrapy (default: 16)
31 #CONCURRENT_REQUESTS = 32
32
33 # Configure a delay for requests for the same website (default: 0)
34 # See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
35 # See also autothrottle settings and docs
36 #DOWNLOAD_DELAY = 3
37 # The download delay setting will honor only one of:
38 #CONCURRENT_REQUESTS_PER_DOMAIN = 16
39 #CONCURRENT_REQUESTS_PER_IP = 16
40
41 # Disable cookies (enabled by default)
42 #COOKIES_ENABLED = False
43
44 # Disable Telnet Console (enabled by default)
45 #TELNETCONSOLE_ENABLED = False
46
47 # Override the default request headers:
48 #DEFAULT_REQUEST_HEADERS = {
49 #   ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
50 #   ‘Accept-Language‘: ‘en‘,
51 #}
52
53 # Enable or disable spider middlewares
54 # See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
55 #SPIDER_MIDDLEWARES = {
56 #    ‘anjuke_gz.middlewares.AnjukeGzSpiderMiddleware‘: 543,
57 #}
58
59 # Enable or disable downloader middlewares
60 # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
61 #DOWNLOADER_MIDDLEWARES = {
62 #    ‘anjuke_gz.middlewares.MyCustomDownloaderMiddleware‘: 543,
63 #}
64
65 # Enable or disable extensions
66 # See http://scrapy.readthedocs.org/en/latest/topics/extensions.html
67 #EXTENSIONS = {
68 #    ‘scrapy.extensions.telnet.TelnetConsole‘: None,
69 #}
70
71 # Configure item pipelines
72 # See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
73 ITEM_PIPELINES = {
74    ‘anjuke_gz.pipelines.AnjukeGzPipeline‘: 300,
75 }
76
77 # Enable and configure the AutoThrottle extension (disabled by default)
78 # See http://doc.scrapy.org/en/latest/topics/autothrottle.html
79 #AUTOTHROTTLE_ENABLED = True
80 # The initial download delay
81 #AUTOTHROTTLE_START_DELAY = 5
82 # The maximum download delay to be set in case of high latencies
83 #AUTOTHROTTLE_MAX_DELAY = 60
84 # The average number of requests Scrapy should be sending in parallel to
85 # each remote server
86 #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
87 # Enable showing throttling stats for every response received:
88 #AUTOTHROTTLE_DEBUG = False
89
90 # Enable and configure HTTP caching (disabled by default)
91 # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
92 HTTPCACHE_ENABLED = True
93 HTTPCACHE_EXPIRATION_SECS = 0
94 HTTPCACHE_DIR = ‘httpcache‘
95 HTTPCACHE_IGNORE_HTTP_CODES = []
96 HTTPCACHE_STORAGE = ‘scrapy.extensions.httpcache.FilesystemCacheStorage‘

接下来,是items。因为没有设置字段,为默认的代码。

 1 # -*- coding: utf-8 -*-
 2
 3 # Define here the models for your scraped items
 4 #
 5 # See documentation in:
 6 # http://doc.scrapy.org/en/latest/topics/items.html
 7
 8 import scrapy
 9
10
11 class AnjukeGzItem(scrapy.Item):
12     # define the fields for your item here like:
13     # name = scrapy.Field()
14     pass

接下来,是piplines.py。在中设置了mongodb的配置。

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

import pymongo
from scrapy.conf import settings

class AnjukeGzPipeline(object):
    def __init__(self):
        host=settings["MONGODB_HOST"]
        port=settings["MONGODB_PORT"]
        dbname=settings["MONGODB_DBNAME"]
        client=pymongo.MongoClient(port=port,host=host)
        tdb = client[dbname]
        self.post=tdb[settings["MONGODB_DOCNAME"]]
    def process_item(self,item,spider):
        info = dict(item)
        self.post.insert(info)
        return item

最后,是最主要的spider.py

 1 from scrapy.http import Request
 2 import scrapy
 3 from bs4 import BeautifulSoup
 4 import re
 5 import requests
 6 """
 7     spider脚本
 8 """
 9 class Myspider(scrapy.Spider):
10     name = ‘anjuke_gz‘
11     allowed_domains = [‘http://gz.fang.anjuke.com/loupan/‘]
12     start_urls = ["http://gz.fang.anjuke.com/loupan/all/p{}/".format(i) for i in range(39)]
13
14     def parse(self, response):
15         soup = BeautifulSoup(response.text,"lxml")
16         content=soup.find_all(class_="items-name") #返回每个楼盘的对应数据
17         for item in content:
18             code=item["href"].split("/")[-1][:6]
19             real_href="http://gz.fang.anjuke.com/loupan/canshu-{}.html?from=loupan_tab".format(code) #拼凑出楼盘详情页的url
20             res=requests.get(real_href)
21             soup = BeautifulSoup(res.text,"lxml")
22             a = re.findall(r‘<div class="name">(.*?)</div>‘, str(soup))
23             b = soup.find_all(class_="des")
24             data = {}
25             for (i, j) in zip(range(len(b)), a):
26                 data[j] = b[i].text.strip().strip("\t")
27                 data["url"] = real_href
28             yield data

下面是存入mongodb的情况。

  因为针对不同的网页结构,爬取的规则是一个,所以爬取的时候就不能针对每个字段进行爬取,所以存到库里的数据如果要是分析的话还需要清洗。

在python中使用mongodb的查询语句,再配合使用pandas应该就很方便清洗了。

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

【scrapy实践】_爬取安居客_广州_新楼盘数据的相关文章

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

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

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/的详

Selenium+PhantomJS自动化登录爬取博客文章

selenium采集页面元素 phantomjs主要是模拟登录 也没多少说的,上代码吧 from selenium import webdriver import selenium.webdriver.support.ui as ui import time def crawl_cnblogs(blog_url,username,pwd): driver = webdriver.PhantomJS() driver.get("http://passport.cnblogs.com/user/si

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

Scrapy爬取博客园精华区内容

程序爬取目标 获取博客园精华区文章的标题.标题链接.作者.作者博客主页链接.摘要.发布时间.评论数.阅读数和推荐数,并存储到MongoDB中. 程序环境 已安装scrapy 已安装MongoDB 创建工程 scrapy startproject cnblogs 在命令提示符中执行上述命令后,会建立一个名为cnblogs的文件夹. 创建爬虫文件 cd cnblogs scrapy genspider cn cnblogs.com 执行上述命令后,会在cnblogs\spiders\下新建一个名为c

爬取知名社区技术文章_分析_1

软件运行环境是什么? python 3.50                                      -- 解释器 scrapy库                                         -- 爬虫框架 pymsql库                                         -- 连接mysql数据库 pillow库                                           -- 下载图片 目标网站是什么

python2.7 爬虫_爬取小说盗墓笔记章节及URL并导入MySQL数据库_20161201

1.爬取页面 http://www.quanshu.net/book/9/9055/ 2.用到模块urllib(网页下载),re正则匹配取得title及titleurl,urlparse(拼接完整url),MySQLdb(导入MySQL) 数据库 3.for 循环遍历列表 取得盗墓笔记章节title 和 titleurl 4.try except 异常处理 5.python 代码 #-*-coding: utf-8 -*- import urllib import re import urlpa