前言
刚刚介绍完基于PyHusky的分布式爬虫原理及实现,让我们具备了设计分布式网络爬虫方便地调动计算资源来实现高效率的数据获取能力。可以说,有了前面的基础,已经能够解决互联网上的绝大部分网站的数据获取问题。下面我将以正常模式爬取某地产网站上相关的新房、二手房和租房信息;然后使用selenium来抓取动态数据来分别介绍两种类型网站的分布式网络爬虫的实现:
实例
由于前面已经设计好了实现分布式爬虫的框架,它们存放在hcrawl目录:
我们只需要针对不同网站格式编写对应的数据特征抓取函数以及设计好爬虫的初始链接和链接规则即可。
静态数据
以地产为例,如下图所示房子的信息,可以以正常的模式请求网页,返回的pagesource中即包含着我们需要的数据特征,例如价格、面积、类型、朝向、年代等等:
#house.py
import sys
import re
import json
import bs4
import time
from hcrawl import crawler_dist as cd
from hcrawl import crawler_config
import bindings.frontend.env as env
#根据不同的网友格式,使用BeautifulSoup提取所需的数据特征。下面为二手房和租房对应的提取函数:
def house_info(url,html):
try:
soup = bs4.BeautifulSoup(html, "lxml")
title = soup.find('dl',{
'class':'fl roominfor'}).text
price = soup.find('div',{
'class':'roombase-price'}).find_all('span')[0].text
room_and_hall = soup.find('div',{
'class':'roombase-price'}).find_all('span')[1].text
area = soup.find('div',{
'class':'roombase-price'}).find_all('span')[2].text
infor_list = soup.find('dl',{
'class':'hbase_txt'}).find_all('p',{
'class':'cell'})
house_info = []
for li in infor_list:
try:
house_info.append((li.find_all('span')[0].text,li.find_all('span')[1].text))
except:
pass
comment_item = soup.find('dl',{
'class':'comment-item clearfix'}).text
T = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
return json.dumps({
"type":"zydc_esf", "title":title, "price":price,"url":url,'room_and_hall':room_and_hall,'area':area,'house_info':house_info,'comment_item':comment_item,'time':T})
except:
if html==None:
return json.dumps({
"type":"request_fail", "url":url})
sys.stderr