目标:
爬出房源的名字、价格、地址和url
需要爬取的数据
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
FANGJIA_ADDRESS = scrapy.Field() # 住房地址
FANGJIA_NAME = scrapy.Field() # 名字
FANGJIA_PRICE = scrapy.Field() # 房价
FANGJIA_URL = scrapy.Field() # 房源url
目标城市
http://hz.lianjia.com/
或者新楼盘:
http://hz.fang.lianjia.com/loupan/nht1/
分析网页源码
先抓取url,再进入具体网页抓取想要的数据。
href="http://hz.fang.lianjia.com/" ><span>新房</span>
XPATH抓取上面a 标签中的href
抓取一个页面的所有的url集合,遍历上面的集合,请求具体页面
fang_links = response.xpath('//div[@class="list-wrap"]/ul[@id="house-lst"]/li/div[@class="pic-panel"]/a/@href').extract()
代码如下:(PS:类名字使用之前豆瓣,忽视之)
import scrapy
from tutorial.items import TutorialItem
from scrapy.selector import Selector
from scrapy.http import Request
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
class Douban(scrapy.Spider):
name = "fangjia"
allowed_domins = ["http://hz.fang.lianjia.com/"]
start_urls = []
def start_requests(self):
global headers
urlhead = 'http://hz.fang.lianjia.com/loupan/'
for i in range(18):
url = urlhead+'pg%snht1' % i
self.start_urls.append(url)
for url in self.start_urls:
print (url)
yield scrapy.Request(url, headers=headers, callback=self.parse)
def parse(self, response):
global headers
fang_links = response.xpath('//div[@class="list-wrap"]/ul[@id="house-lst"]/li/div[@class="pic-panel"]/a/@href').extract()
if fang_links:
for fang_link in fang_links:
url = 'http://hz.fang.lianjia.com'+fang_link
yield scrapy.Request(url, headers=headers, callback=self.parse_fangjia)
def parse_fangjia(self, response):
item = TutorialItem()
name = response.xpath('//div[@class="name-box"]/a/@title').extract()[0]
url = response.xpath('//div[@class="name-box"]/a/@href').extract()[0]
price = response.xpath('//p[@class="jiage"]/span[@class="junjia"]/text()').extract()[0]
address = response.xpath('//p[@class="where"]/span/@title').extract()[0]
item['FANGJIA_NAME'] = name
item['FANGJIA_ADDRESS'] = address
item['FANGJIA_PRICE'] = price
item['FANGJIA_URL'] = 'http://hz.fang.lianjia.com'+url
print (item['FANGJIA_NAME'])
print (item['FANGJIA_ADDRESS'])
print (item['FANGJIA_PRICE'])
print (item['FANGJIA_URL'])
yield item
爬虫代码说明:
allowed_domins 可选。包含了spider允许爬取的域名(domain)列表(list)。
name 定义spider名字的字符串(string)。
start_urls URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一。
start_requests() 该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。 该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。
该方法的默认实现是使用 start_urls 的url生成Request。
如果您想要修改最初爬取某个网站的Request对象,您可以重写(override)该方法。
本例中该函数主要是获取start_urls列。然后每个url都调用parse函数。
for url in self.start_urls:
print (url)
yield scrapy.Request(url, headers=headers, callback=self.parse)
parse(response)
当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法。
parse 负责处理response并返回处理的数据以及(/或)跟进的URL。 Spider 对其他的Request的回调函数也有相同的要求。该方法及其他的Request回调函数必须返回一个包含 Request 及(或) Item 的可迭代的对象。
本例中,主要是处理每个URL,拼接URL,然后调用parse_fangjia函数。
parse_fangjia函数
该函数是真实爬取的主函数,从最后拼接的URL中获取名字、地址、加个和URL,并输出。
总体过程小总,首先框架调用由start_requests函数,生成需要爬的初始URL,18个,
然后18次循环,每次循环中每个URL触发parse函数,将所爬URL中的URL提取出来并拼接形成新的URL组。然后再次循环遍历新的URL组中URL,调用parse_fangjia函数。
爬虫
保存成CSV格式
#scrapy crawl ganglia -o ganglia.csv -t csv
Safari显示网页源码:
新版的Safari在菜单栏里看不到“查看网页源码”的菜单了
点击Safari菜单栏,选择“偏好设置”
在弹出来的窗口中,选择 “高级”页签,勾选 “在菜单栏里显示开发菜单”
回到要查看源码的页面,点击上方开发菜单
新闻热点
疑难解答